二叉树总结—建树和4种遍历方式(递归非递归)
生活随笔
收集整理的這篇文章主要介紹了
二叉树总结—建树和4种遍历方式(递归非递归)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
版權聲明:本文為博主原創文章,未經博主同意不得轉載。 https://blog.csdn.net/u013497151/article/details/27967155
今天總結一下二叉樹。要考離散了,求不掛!二叉樹最重要的就是 建立、4種遍歷方式。簡單應用。怎樣推斷兩顆二叉樹是否類似
1).滿二叉樹 高度為h ,節點數則為 2^h - 1。且葉子節點全在最下層,且葉子節點數為2^(n-1)個{n代表二叉樹層數,也叫深度}
? ??
二、中序遍歷
??
? ? 1.先訪問左分支
? ? 2.在訪問根節點
? ? 3.再訪問右分支
上述圖片二叉樹的中序遍歷:DGBAECF
三、興許遍歷
? ? 1.先訪問左分支
? ? 2.再訪問右分支
今天總結一下二叉樹。要考離散了,求不掛!二叉樹最重要的就是 建立、4種遍歷方式。簡單應用。怎樣推斷兩顆二叉樹是否類似
二叉樹分為 :1、全然二叉樹 ?2、滿二叉樹
1).滿二叉樹 高度為h ,節點數則為 2^h - 1。且葉子節點全在最下層,且葉子節點數為2^(n-1)個{n代表二叉樹層數,也叫深度}
2).n個節點的 全然二叉樹 深度為 int(log2n)(以2為底n的對數)+ 1。?
3).非空二叉樹 葉子節點個數==雙分支節點數+14).非空二叉樹 某節點編號 n ?若有左孩子,則左孩子節點 2*n,若有右孩子。則其節點編號為2*n+1
5).知道當中兩種遍歷方式,就可知第三種遍歷方式。
6).推斷倆顆二叉樹是否同樣,僅僅需推斷他們隨意倆種相相應的遍歷順序就可以
建樹:
已知輸入的字符為某顆二叉樹的先序序列,如abcXXdeXgXXfXXX (當中X表示空節點),建立二叉樹
struct node *make() {char c;node *st;c = getchar();if(c=='X')st = NULL;else{st = (struct node *)malloc(sizeof(struct node));st ->data = c;//已知為先序遍歷。先填充根節點st ->left = make();//遞歸形式填充左分支st->right = make();//遞歸形式填充左分支}return st; }
遍歷方式:
遍歷方式非常重要,首先要知道怎樣遍歷,才干打出代碼。如今腦海里模擬一遍
一、先序遍歷? ??
? ? 1.先訪問根節點
? ? 2.再訪問左分支? ? 3.再訪問右分支
上述圖片二叉樹的先序遍歷:ABDGCEF
二、中序遍歷
??
? ? 1.先訪問左分支
? ? 2.在訪問根節點
? ? 3.再訪問右分支
上述圖片二叉樹的中序遍歷:DGBAECF
三、興許遍歷
? ? 1.先訪問左分支
? ? 2.再訪問右分支
? ? 3.再訪問根節點
上述圖片二叉樹的后序遍歷:GDBEFCA
四、層次遍歷
就是從每一層依照從左至右的順序,一次遍歷該層全部的節點
採用環形隊列的方法,進行訪問
訪問葉子節點上述遞歸示意圖例如以下:
二叉樹的深度
從當前節點的左右分支開始推斷。誰大自增1
推斷倆顆二叉樹是否類似
1.全部節點的相應左右孩子都同樣
2.如過 有隨意倆種遍歷方式同樣,那么倆顆樹就同樣
代碼模版:
#include <iostream> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <algorithm> const int N = 1010; using namespace std; char a[100]; struct node{char data;node *left;node *right; }; struct node *make() {char c;node *st;c = getchar();if(c=='X')st = NULL;else{st = (struct node *)malloc(sizeof(struct node));st ->data = c;//已知為先序遍歷,先填充根節點st ->left = make();//遞歸形式填充左分支st->right = make();//遞歸形式填充左分支}return st; }void First_Order(struct node *t )//先序遍歷的遞歸形式 {if(t==NULL)return ;printf("%c -> ",t->data);First_Order(t->left);First_Order(t->right); } void First_Order_1(struct node *t)//先序遍歷非遞歸形式 {struct node *stk[N],*p;int top = -1;if(t!=NULL){top++;stk[top] = t; //根節點進棧while(top>-1){p = stk[top];//出棧并訪問該節點top--;printf("%c -> ",p->data);if(p->right!=NULL) //右孩子進棧{top++;stk[top] = p->right;}if(p->left!=NULL)//左孩子進棧{top++;stk[top] = p->left;}}} } void Mid_Order(struct node *t)//中序遍歷遞歸形式 {if(t==NULL)return ;Mid_Order(t->left);printf("%c -> ",t->data);Mid_Order(t->right); }void Mid_Order_1(struct node *t)//先序遍歷非遞歸形式 {struct node *stk[N],*p;int top = -1;if(t!=NULL){p = t;while(top>-1 ||p!=NULL )// 遍歷左分支{while(p!=NULL) // 將當前t節點的左分支。全部壓入棧{top++;stk[top] = p;p = p->left;}//while結束后。棧頂元素可能沒有左分支節點或者左分支節點已經訪問完成if(top>-1){p = stk[top];//出棧 ,并打印top--;printf("%c -> ",p->data);p = p->right; // 遍歷右分支}}} }void Last_Order(struct node *t)//后序遍歷遞歸形式 {if(t==NULL)return ;Last_Order(t->right);Last_Order(t->left);printf("%c -> ",t->data); }void Print_Leaf(struct node *t) {if(t!=NULL){if(t->left==NULL && t->right==NULL){printf("%c ",t->data);}Print_Leaf(t->left);//訪問左分支的葉子節點Print_Leaf(t->right);//訪問右分支的葉子節點} }void Ceng_Order(struct node *t)//層次遍歷,採用循環隊列來實現 {struct node *que[N],*p;int f,r; //隊列的頭指針 和 尾指針f = -1; r = -1;que[++r] = t; //根節點入隊while(f!=r){f = (f + 1)% N; //防止隊溢出p = que[f]; //隊列頭結點 出隊printf("%c -> ",p->data);if(p->left !=NULL) // 將其左孩子 壓入隊列{r = (r + 1 )% N;que[r] = p->left;}if(p->right !=NULL) // 將其右孩子 壓入隊列{r = (r + 1 )% N;que[r] = p -> right;}} }int shendu(struct node *t) {int x=0,y = 0;if(t!=NULL){x = shendu(t->left);y = shendu(t->right);if(x>y)return(x+1);elsereturn (y+1);}elsereturn 0; }/*bool Like(struct node *t1,struct node *t2)//推斷倆顆樹是否類似 {bool like1,like2;if(t1==NULL && t2 ==NULL)return true; //全部相應的分支都同樣else if(t1==NULL || t2 ==NULL)return false;else{like1 = Like(t1->left,t2->left);like2 = Like(t1->right,t2->left);return (like1 && like2); //返回的是 like1 與 like2的 與} }*/int main() {struct node *t;t = make();//建樹puts("先序遍歷,遞歸形式");First_Order(t);cout<<"END"<<endl<<endl;puts("非遞歸形式");First_Order_1(t);cout<<"END"<<endl<<endl;puts("中序遍歷,遞歸形式");Mid_Order(t);cout<<"END"<<endl<<endl;puts("非遞歸形式");Mid_Order_1(t);cout<<"END"<<endl<<endl;puts("后序遍歷,遞歸形式");Last_Order(t);cout<<"END"<<endl<<endl;puts("層次遍歷");Ceng_Order(t);cout<<"END"<<endl<<endl;/* puts("推斷倆個二叉樹是否類似");輸入兩個二叉樹.....bool m = Like(t1,t2);if(m==1)printf("YES\n");elseprintf("NO\n");cout<<endl;*/puts("深度");int du = shendu(t);printf("%d\n",du);puts("葉子節點為");Print_Leaf(t);cout<<endl<<endl;return 0; }
轉載于:https://www.cnblogs.com/ldxsuanfa/p/10482397.html
總結
以上是生活随笔為你收集整理的二叉树总结—建树和4种遍历方式(递归非递归)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 572. Subtree of Anot
- 下一篇: Python并发编程之:多进程