/*准备数据*/#define MANLEN 20 //最大长度
typedef char DATA; //定义元素类型
typedef struct CBT //定义二叉树结点类型
{DATA data; //元素数据struct CBT* left; //左子树结点指针struct CBT* right; //右子树结点指针
}CBTType;/*初始化二叉树*/
CBTType* InitTree() //初始化二叉树的根
{CBTType* node;if (node = (CBTType*)malloc(sizeof(CBTType)))//申请内存{cout << "请输入一个结点的数据: " << endl;cin>> node->data;node->left = NULL;node->right = NULL;if (node != NULL){return node;}else{return NULL;}}return NULL;
}/*添加结点*/void AddTreeNode(CBTType* treeNode)
{CBTType *pnode, *parent;DATA data;char menusel;if (pnode = (CBTType*)malloc(sizeof(CBTType))){cout << "请输入二叉树结点数据: " << endl;fflush(stdin);cin >> pnode->data;pnode->left = NULL;pnode->right = NULL;cout << "请输入该结点的父结点数据: ";fflush(stdin);cin >> data;parent = TreeFindNode(treeNode, data);if (!parent){cout << "未找到父结点!";free(pnode);return;}cout << ("1.添加该结点到左子树\n2.添加该结点到右子树\n");do{menusel = getchar();menusel -= '0';if (menusel == 1 || menusel == 2){if (parent == NULL){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);}
}/*查找结点*/CBTType* TreeFindNode(CBTType* treenode, DATA data)
{CBTType* ptr;if (treenode == NULL){return NULL;}else{if (treenode->data == data){return treenode;}else{if (ptr = TreeFindNode(treenode->left, data)){return ptr;}else if (ptr=TreeFindNode(treenode->right,ENODATA)){return ptr;}else //分别向左右子数递归查找{return NULL;}}}
}/*获取左子树*/CBTType* TreeLeftNode(CBTType* treenode)
{if (treenode){return treenode->left;}else{return NULL;}
}/*获取右子树*/CBTType* TreeLeftNode(CBTType* treenode)
{if (treenode){return treenode->right;}else{return NULL;}
}/*判断空树*/int TreeIsEmpty(CBTType* treenose)
{if (treenose){return 0;}else{return 1;}
}/*计算二叉树的深度*/
//计算深度就是就算二叉树中结点最大的层数,往往需要采用递归算法实现int TreeDepth(CBTType* treenode)
{int depleft, depright;if (treenode == NULL){return 0;}else{depleft = TreeDepth(treenode->left); //左子树深度(递归调用)depright = TreeDepth(treenode->right); //右子树深度(递归调用)if (depleft > depright){return depleft + 1;}else{return depright + 1;}}
}/*清空二叉树*/
/*使用递归*/void ClearTree(CBTType* treenode)
{if (treenode){ClearTree(treenode->left); //清空左子树ClearTree(treenode->right); //清空右子树free(treenode); //释放当前结点所占内存treenode = NULL;}
}/*显示结点数据*/
//显示结点数据就是显示当前结点的数据void TreeNodeData(CBTType* p)
{cout << p->data << endl;
}
//参数p为带显示的结点