//二叉树操作#include<iostream>
#include<algorithm>
using namespace std;//准备数据#define MANLEN 20
typedef char DATA;
typedef struct CBT
{DATA data;struct CBT*left;struct CBT*right;
}CBTT;//初始二叉树,设置一个根节点CBTT* InitTree()
{CBTT* node;if (node = (CBTT*)malloc(sizeof(CBTT))){cout << "请先输入一个根节点数据: " << endl;cin >> node->data;node->left = nullptr;node->right = nullptr;if (node != nullptr){return node;}else{return nullptr;}return nullptr;}
}//添加结点
void AddTreeNode(CBTT* treeNode)
{CBTT* pnode, *parent;DATA data;char menusel;if (pnode = (CBTT*)malloc(sizeof(CBTT))){cout << "请输入要加入的数据: " << endl;cin >> pnode->data;pnode->left = nullptr;pnode->right = nullptr;cout << "请输入该结点的父结点数据: " << endl;fflush(stdin);cin >> data;parent = TreeFindNode(treeNode, data);if (!parent){cout << "未找到该父节点!" << endl;free(pnode);return;}cout << "1.添加到左子树 \n 2.添加到右子树" << endl;do{menusel = getchar();menusel = '0';if (menusel == 1 || menusel == 2){if (parent == nullptr){cout << "不存在父结点,请先设置父结点" << endl;}else{switch (menusel){case 1:if (parent->left){cout << "左子树不为空" << endl;}else{parent->left = pnode;}break;case 2:if (parent->right){cout << "右子树不为空" << endl;}else{parent->right = pnode;}break;default:cout << "无效参数" << endl;}}}} while (menusel!=1 && menusel!=2);}}//查找结点,先判断根是否为空然后递归查找左右子树
CBTT* TreeFindNode(CBTT* treeNode, DATA data)
{CBTT* ptr;if (treeNode == nullptr){return nullptr;}else{if (treeNode->data == data){return treeNode;}else{if (ptr = TreeFindNode(treeNode->left)){return ptr;}else if (ptr = TreeFindNode(treeNode->right)){return ptr;}else{return nullptr;}}}
}//获取左子树
CBTT* TreeLeftNode(CBTT* treeNode)
{if (treeNode){return treeNode->left;}else{return nullptr;}}//获取右子树
CBTT* TreeRightNode(CBTT* treeNode)
{if (treeNode){return treeNode->right;}else{return nullptr;}}//计算二叉树的深度
int TreeDepth(CBTT* treeNode)
{int depleft, depright;if (treeNode == nullptr){return 0;}else{depleft = TreeDepth(treeNode->left);depright = TreeDepth(treeNode->right);if (depleft > depright){return depleft + 1;}else{return depright + 1;}}
}//清空二叉树
void ClearTree(CBTT* treeNode)
{if (treeNode){ClearTree(treeNode->left);ClearTree(treeNode->right);free(treeNode);treeNode = nullptr;}
}//前序遍历void preorderTrav(CBTT* treeNode)
{if (treeNode == nullptr)return;cout << treeNode->data;preorderTrav(treeNode->left);preorderTrav(treeNode->right);
}//中序遍历void preorderTrav(CBTT* treeNode)
{if (treeNode == nullptr)return;preorderTrav(treeNode->left);cout << treeNode->data;preorderTrav(treeNode->right);
}//后续遍历void preorderTrav(CBTT* treeNode)
{if (treeNode == nullptr)return;preorderTrav(treeNode->left);preorderTrav(treeNode->right);cout << treeNode->data;
}//求二叉树高度
int getTreeHigh(CBTT* root)
{if (root == NULL)return 0;int left_high = getTreeHigh(root->left);int right_high = getTreeHigh(root->right);return max(left_high, right_high) + 1;
}