二叉树的建立和遍历
Date:2019-06-28 13:51:23
二叉树的建立
- 注意一下中序和层序建树
1 2 //给出当前先序序列PreL, PreL+1, ..., Pre(L+numLeft), Pre(L+numLeft+1), ..., PreR 3 //给出当前中序序列InL, InL+1, ..., In(K-1), InK, In(k+1), ..., InR 4 BiTnode* CreatePreIn(int preL, int preR, int inL, int inR) 5 { 6 if(preL > preR) 7 return NULL; //先序序列长度小于0 8 9 BiTnode *root = new BiTnode; 10 root->data = pre[preL]; 11 int k; 12 for(int k=inL; k<=inR; k++) 13 if(in[k] == pre[preL]) //在中序序列中找到根节点 14 break; 15 int numLeft = k - inL; //由中序序列得到左子树结点的个数 16 17 //左子树的先序区间为[preL+1, preL+numLeft], 左子树的中序区间为[inL, k-1]; 18 root->lchild = CreatePreIn(preL+1, preL+numLeft, inL, k-1); 19 //右子树的先序区间为[preL+numLeft+1, preR], 右子树的中序区间为[k+1, inR]; 20 root->rchild = CreatePreIn(preL+numLeft+1, preR, k+1, inR); 21 22 return root; 23 } 24 25 //给出当前后序序列PostL, PostL+1, ..., Post(L+numLeft-1), Post(L+numLeft), ..., Pre(R-1), PreR 26 //给出当前中序序列InL, InL+1, ..., In(k-1), Ink, In(k+1), ..., InR 27 BiTnode* CreatePostIn(int postL, int postR, int InL, int inR) 28 { 29 if(postL > postR) 30 return NULL; 31 32 BiTnode *root = new BiTnode; 33 root->data = post[postR]; 34 int k; 35 for(int k=inL; k<=inR; k++) 36 if(In[k] == post[postR]) 37 break; 38 int numleft = k - inL; 39 40 root->lchild = CreatePostIn(postL, postL+numLeft-1, inL, k-1); 41 root->rchild = CreatePostIn(postL+numLeft, postR-1, k+1, inR); 42 43 return root; 44 } 45 46 //给出当前中序序列InL, ..., In(k-1), Ink, In(k+1), ..., InR 47 //给出当前层次序列layerL, ..., layerR 48 BiTnode* CreateLayerIn(int inL, int inR, int layerL, int layerR) 49 { 50 if(inL > inR) 51 return NULL; 52 BiTnode *root = new BiTnode; 53 54 int i, j; 55 for(int i=layerL; i<=layerR; i++) 56 { 57 int x=0; 58 for(int j=inL; j<=inR; j++) 59 { 60 if(layer[i] = in[j]) 61 { 62 b = 1; 63 root->data = in[j]; 64 break; 65 } 66 } 67 if(b) break; 68 } 69 root->lchild = CreateLayerIn(inL, j-1, layerL, layerR); 70 root->rchild = CreateLayerIn(j+1, inR, layerL, layerR); 71 72 return root; 73 }
二叉树的遍历
1 //先序 2 void PreOrder(BiTnode* T) 3 { 4 if(T == NULL) 5 return; 6 //visit(T); 7 PreOrder(T->lchild); 8 PreOrder(T->rchild); 9 } 10 11 //先序非递归 12 #include <stack> 13 using namespace std; 14 void PreOrder(BiTnode* T) 15 { 16 stack<BiTnode*> s; 17 BiTnode *p = T; 18 while(p || !s.empty()) 19 { 20 if(p) 21 { 22 //visit(p); 23 s.push(p); 24 p = p->lchild; 25 } 26 else 27 { 28 p = s.top(); 29 s.pop(); 30 p = p->rchild; 31 } 32 } 33 } 34 35 //中序 36 void InOrder(BiTnode* T) 37 { 38 if(T == NULL) 39 return 40 InOrder(T->lchild); 41 //visit(T); 42 InOrder(T->rchild); 43 } 44 45 //中序非递归 46 #include <stack> 47 using namespace std; 48 void InOrder2(BiTnode* T) 49 { 50 stack<BiTnode*> s; 51 BiTnode *p = T; 52 while(p || !s.empty()) 53 { 54 if(p) 55 { 56 s.push(p); 57 p = p->lchild; 58 } 59 else 60 { 61 p = s.top(); 62 //visit(p); 63 s.pop(); 64 p = p->rchild; 65 } 66 } 67 } 68 69 //后序 70 void PostOrder(BiTnode* T) 71 { 72 if(T == NULL) 73 return; 74 PostOrder(T->lchild); 75 PostOrder(T->rchild); 76 //visit(T); 77 } 78 79 //后序非递归 80 void PostOrder(BiTnode* T) 81 { 82 stack<BiTnode*> s; 83 BiTnode *p, *r=NULL; 84 while(p || !s.empty()) 85 { 86 if(p) 87 { 88 s.push(p); 89 p = p->lchild; 90 } 91 else 92 { 93 p = s.top(); 94 if(p->rchild && p->rchild!=r) 95 { 96 p = p->rchild; 97 s.push(p); 98 p = p->lchild; 99 } 100 else 101 { //p出栈时,栈内为根节点到p的路径,以此可以求解公共结点等 102 //visit(p); 103 s.pop(); 104 r = p; 105 p = NULL; 106 } 107 } 108 } 109 } 110 111 //层次 112 #include <queue> 113 using namespace std; 114 void LevelOrder(BiTnode* T) 115 { 116 queue<BiTnode*> q; //队列中存放BiTnode变量的地址,这样就可以通过访问地址去修改原元素 117 T->level = 1; //记录结点深度 118 q.push(T); 119 while(!q.empty()) 120 { 121 BiTnode *p = q.front(); 122 q.pop(); 123 //visit(p); 124 if(p->lchild) 125 { 126 p->lchild->level = p->level + 1; //计算各结点深度 127 q.push(p->lchild); 128 } 129 if(p->rchild) 130 { 131 p->rchild->level = p->level + 1; 132 q.push(p->rchild); 133 } 134 } 135 }
多叉树的静态表示
1 //存储结构:孩子表示法 2 #include <vector> 3 using namespace std; 4 const int M = 1e3; 5 struct node 6 { 7 int layer; //结点深度 8 int data; 9 vector<int> children; 10 }tree[M]; 11 12 //若结点不涉及数据域,可以简化结点结构 13 vector<int> child[M]; 14 15 //插入结点 16 int index=0; 17 int NewNode(int x) 18 { 19 tree[index].data = x; 20 tree[index].children.clear(); 21 return index++; 22 } 23 24 //遍历 25 void PreOrder(int root) 26 { 27 printf("%d ", tree[root].data); //先根遍历 28 for(int i=0; i<tree[root].children.size(); i++) 29 PreOrder(tree[root].children[i]); 30 Printf("%d ", tree[root].data); //后根遍历 31 } 32 33 //层序遍历 34 #include <queue> 35 using namespace std; 36 void LayerOrder(int root) 37 { 38 queue<int> q; 39 tree[root].layer = 0; 40 q.push(root); 41 while(!q.empty()) 42 { 43 root = q.front(); 44 q.pop(); 45 printf("%d ", tree[root].data); 46 for(int i=0; i<tree[root].children.size(); i++) 47 { 48 int child = tree[root].children[i]; 49 tree[child].layer = tree[root].layer+1; 50 q.push(child); 51 } 52 } 53 }