一、以二叉链表作为二叉树的存储结构
(1)统计二叉树的叶结点个数
(2)判别两棵树是否相等
(3)交换二叉树每个结点的左孩子和右孩子
(4)设计二叉树的双序遍历算法(递归调用)
(5)求二叉树的深度
二、完整代码:
#include<iostream> using namespace std; typedef struct TreeNode { char data;//数据域 TreeNode* Lchild;//左孩子 TreeNode* Rchild;//右孩子 }*Tree,TreeNode; //前序创建二叉树 void CreateTree(Tree& T) { char x; cin >> x; if (x =='*') { T = NULL; } else { T = new TreeNode;//新建一个结点 T->data = x; CreateTree(T->Lchild);//生成左孩子结点 CreateTree(T->Rchild);//生成右孩子结点 } } //先序遍历 void Pre_Traversal(const Tree& T) { if (T) { cout << T->data<<" "; Pre_Traversal(T->Lchild); Pre_Traversal(T->Rchild); } } //中序遍历 void Ino_Traversal(const Tree& T) { if (T) { Ino_Traversal(T->Lchild); cout << T->data<<" "; Ino_Traversal(T->Rchild); } } //后序遍历 void Pos_Traversal(const Tree& T) { if (T) { Pos_Traversal(T->Lchild); Pos_Traversal(T->Rchild); cout << T->data << " "; } } //二叉树是否为空 bool TreeEmpty(const Tree& T) { if (T == NULL) { cout << "该二叉树为空!"<<endl; return true; } else { cout << "该二叉树为不为空!"<<endl; return false; } } //求二叉树的叶子节点数 int Treeleaf_Count(const Tree& T) { if(T == NULL) { return 0; } if (T->Lchild == NULL && T->Rchild == NULL) { return 1; } return Treeleaf_Count(T->Lchild) + Treeleaf_Count(T->Rchild); } //交换左孩子和右孩子 void swap( Tree& T) { //如果T不存在,就返回 if(T == NULL) { return; } //如果T的左右子树都不存在就返回 if(T->Lchild == NULL && T->Rchild == NULL) { return; } //左右子树交换 Tree tmp = T->Lchild; T->Lchild = T->Rchild; T->Rchild = tmp; swap(T->Lchild); swap(T->Rchild); } //求二叉树的深度 int TreeDepth(const Tree& T) { if (T == NULL) return 0; else { int i = TreeDepth(T->Lchild); int j = TreeDepth(T->Rchild); return i > j ? i + 1 : j + 1; } } // 递归比较两棵树是否相等 bool CompareTrees(Tree& t1, Tree& t2) { if (t1 && t2) { // 比较当前节点的值 if (t1->data == t2->data) { // 递归比较左子树和右子树 return CompareTrees(t1->Lchild, t2->Lchild) && CompareTrees(t1->Rchild, t2->Rchild); } else { return false; } } else if (!t1 && !t2) { // 如果都是空树,二者相同 return true; } else { // 其他情况,二者不同 return false; } } // 双序遍历:先序遍历 + 后序遍历 void DoubleOrderTraversal(Tree& root) { if (root) { // 先输出根节点 cout << root->data << " "; // 递归遍历左子树 DoubleOrderTraversal(root->Lchild); // 递归遍历右子树 DoubleOrderTraversal(root->Rchild); // 再输出根节点 cout << root->data << " "; } } int main(){ Tree T; cout << "请按先序遍历的顺序创建二叉树,若其节点的左孩子或右孩子不存在则使用*代替!如:(ABC**DE*G**F***)" << endl; CreateTree(T); TreeEmpty(T); cout << "先序遍历的结果为:"; Pre_Traversal(T) ; cout<< endl; cout << "中序遍历的结果为:"; Ino_Traversal(T); cout << endl; cout << "后序遍历的结果为:"; Pos_Traversal(T); cout << endl; cout << "该树的深度为:"<< TreeDepth(T)<< endl; cout << "该树的叶子节点数为:" << Treeleaf_Count(T) << endl; swap(T); cout << "该先序排序的树交换左右孩子后的先序排序结果为:" <<endl; Pre_Traversal(T); cout<<"\n"<<endl; Tree tree1; Tree tree2; cout<<"输入tree1树:"<<endl; CreateTree(tree1); cout<<"输入tree2树:"<<endl; CreateTree(tree2); if (CompareTrees(tree1, tree2)) { cout << "两棵树相等" << endl; } else { cout << "两棵树不相等" << endl; } Tree tree3; cout<<"输入tree3树:"<<endl; CreateTree(tree3); // 进行双序遍历 cout<<"tree3树双序(先+后)遍历的结果为:"<<endl; DoubleOrderTraversal(tree3); cout<<"\n"<<endl; system("pause"); }