C++实现二叉树及其常规操作
二叉树是一种基本的数据结构,它的特点是每个节点至多只有两颗子树,并且其子树有左右之分,不能颠倒。通常使用链式存储结构存储二叉树。下面是其的基本C++实现。包括创建二叉树和三种遍历。
1 #include <iostream> 2 using namespace std; 3 4 typedef char ElemType; 5 6 //二叉树链式结构实现 7 typedef struct BinaryTreeNode 8 { 9 ElemType data; 10 BinaryTreeNode *left; 11 BinaryTreeNode *right; 12 }BinaryTreeNode, *tree; 13 14 /*先序遍历二叉树的节点*/ 15 void PreOrderTraverse (const tree &T); 16 /*中序遍历二叉树的节点*/ 17 void InOrderTraverse (const tree &T); 18 /*后续遍历二叉树的节点*/ 19 void PostOrderTraverse (const tree &T); 20 /*按照先序创建二叉树,本例中我们将每个二叉树的节点的空指针引出一个虚节点(代表该节点后面不会再有新的节点, 21 * 即该子书生长结束),其值为一特值,此处使用'#'。因此我们在创建子树时输入的先序序列为AB#D##C##,其只有四个节点 22 * 如下所示: 23 * A A 24 * / \ / \ 25 * 普通二叉树: B C 扩展二叉树: B C 26 * \ / \ / \ 27 * D # D # # 28 * / \ 29 * # # 30 */ 31 void CreateTree (tree &T); 32 33 void PreOrderTraverse (const tree &T) 34 { 35 if (!T)//空树 36 { 37 return; 38 } 39 cout << T->data << " "; 40 PreOrderTraverse (T->left); 41 PreOrderTraverse (T->right); 42 } 43 44 void InOrderTraverse (const tree &T) 45 { 46 if (!T)//空树 47 { 48 return; 49 } 50 InOrderTraverse (T->left); 51 cout << T->data << " "; 52 InOrderTraverse (T->right); 53 } 54 55 void PostOrderTraverse (const tree &T) 56 { 57 if (!T)//空树 58 { 59 return; 60 } 61 PostOrderTraverse (T->left); 62 PostOrderTraverse (T->right); 63 cout << T->data << " "; 64 } 65 66 void CreateTree (tree &T) 67 { 68 char input; 69 cout << "Please input a char: "; 70 cin >> input; 71 if ('#' == input)//默认'#'为结束标示 72 { 73 return; 74 } 75 else 76 { 77 T = new BinaryTreeNode; 78 T->data = input; 79 if (!T)//new failed 80 { 81 return; 82 } 83 CreateTree (T->left); 84 CreateTree (T->right); 85 } 86 } 87 88 int main () 89 { 90 tree T; 91 CreateTree (T); 92 cout << "先序遍历:"; 93 PreOrderTraverse (T); 94 cout << "中序遍历:"; 95 InOrderTraverse (T); 96 cout << "后序遍历:"; 97 PostOrderTraverse (T); 98 return 0; 99 }
运行结果如下所示:
Please input a char: A Please input a char: B Please input a char: # Please input a char: D Please input a char: # Please input a char: # Please input a char: C Please input a char: # Please input a char: # 先序遍历:A B D C 中序遍历:B D A C 后序遍历:D B C A