#include #include #include //二叉鏈表示法
typedef struct bitnode
bitnode, *bitree;
/*呼叫preorder(t1),t1是根結點,不為null,執行printf("%d\t",root->data);列印出來1
呼叫preorder(root->lchild);訪問了根節點(t1)的左孩子(t2),不為null,執行printf("%d\t",root->data);列印出來2
遞迴呼叫preorder(root->lchild);訪問了t2結點的左孩子(t4),不為null,執行printf("%d\t",root->data);列印出來4
遞迴呼叫preorder(root->lchild);訪問了t4結點的左孩子,為null,返回此函式,此時遞迴呼叫preorder(root->rchild);訪問t4的右孩子,發現還是為null,於是函式執行完畢,返回上一級遞迴的函式
也就是(列印t2結點函式),呼叫preorder(root->rchild);訪問t2的右孩子,為null,在返回到上一級遞迴函式(列印根節點t1函式),呼叫preorder(root->rchild);訪問根節點的右孩子
也就是t3,不為null,故執行printf("%d\t",root->data);列印出來3,遞迴呼叫preorder(root->lchild);訪問了t3結點的左孩子(t5),不為null,執行printf("%d\t",root->data);列印出來5
呼叫preorder(root->lchild);訪問t5的左孩子,為null,在返回到上一級遞迴函式(列印根節點t3函式),
呼叫preorder(root->rchild);訪問t3的右孩子,為null,在返回到上一級遞迴函式(列印根節點t1函式)
之後所以遞迴函式呼叫結束,前序遍歷演算法函式呼叫結束
*/void preorder(bitnode *root)
printf("%d\t",root->data);
//遍歷左子樹
preorder(root->lchild);
//遍歷右子樹
preorder(root->rchild);
}int main()
#include #include #include //二叉鏈表示法
typedef struct bitnode
bitnode, *bitree;
/*呼叫preorder(t1),t1是根結點,不為null,執行printf("%d\t",root->data);列印出來1
呼叫preorder(root->lchild);訪問了根節點(t1)的左孩子(t2),不為null,執行printf("%d\t",root->data);列印出來2
遞迴呼叫preorder(root->lchild);訪問了t2結點的左孩子(t4),不為null,執行printf("%d\t",root->data);列印出來4
遞迴呼叫preorder(root->lchild);訪問了t4結點的左孩子,為null,返回此函式,此時遞迴呼叫preorder(root->rchild);訪問t4的右孩子,發現還是為null,於是函式執行完畢,返回上一級遞迴的函式
也就是(列印t2結點函式),呼叫preorder(root->rchild);訪問t2的右孩子,為null,在返回到上一級遞迴函式(列印根節點t1函式),呼叫preorder(root->rchild);訪問根節點的右孩子
也就是t3,不為null,故執行printf("%d\t",root->data);列印出來3,遞迴呼叫preorder(root->lchild);訪問了t3結點的左孩子(t5),不為null,執行printf("%d\t",root->data);列印出來5
呼叫preorder(root->lchild);訪問t5的左孩子,為null,在返回到上一級遞迴函式(列印根節點t3函式),
呼叫preorder(root->rchild);訪問t3的右孩子,為null,在返回到上一級遞迴函式(列印根節點t1函式)
之後所以遞迴函式呼叫結束,前序遍歷演算法函式呼叫結束
*/void preorder(bitnode *root)
printf("%c\t",root->data);
//遍歷左子樹
preorder(root->lchild);
//遍歷右子樹
preorder(root->rchild);}/*
中序遍歷演算法
呼叫inorder(a),根節點不為null,於是呼叫inorder(root->lchild);繼續呼叫inorder(b),訪問b,當前指標不為null,
繼續呼叫inorder(d),不為null,繼續呼叫inorder(root->lchild);訪問h,h不為null,繼續呼叫inorder(root->lchild),h無左孩子,為空,返回上一級遞迴函式中,執行列印函式 printf("%c\t", root->data);得到h
接著呼叫inorder(root->rchild);訪問h的右孩子k,發現不為nul,因為k無左孩子,執行完inorder(root->lchild);直接執行printf("%c\t", root->data);列印k
因為k無右孩子,所以返回,直接返回到呼叫函式到字母d,列印d,繼續呼叫inorder(root->rchild);但是d無右孩子,返回上一級遞迴函式b,列印b,
之後呼叫inorder(root->rchild);訪問e,不為null,執行完inorder(root->lchild);因e無左孩子,直接列印出來e,接著訪問e的右孩子,發現沒有,則返回到根節點位置
列印a,然後繼續呼叫inorder(root->rchild);訪問c,不為null,呼叫inorder(root->lchild);訪問f,不為null,繼續inorder(root->lchild);訪問i
i不為null,繼續呼叫inorder(root->lchild);因為i沒有左孩子,返回到i,列印i,繼續呼叫inorder(root->rchild);發現i無右孩子
返回到f,列印f,f無右孩子,返回到c,列印c,接著呼叫inorder(root->rchild);訪問g,g不為null,呼叫inorder(root->lchild);因g無左孩子,列印g,繼續呼叫inorder(root->rchild);訪問j,因為j無左孩子,直接列印j,無右孩子,返回,遞迴呼叫結束
*///先左子樹 然後根 最後右子樹
void inorder(bitnode *root)
//遍歷左子樹
inorder(root->lchild);
printf("%c\t", root->data);
//遍歷右子樹
inorder(root->rchild);
}//先左子樹-右子樹-根
void postorder(bitnode *root)
//遍歷左子樹
postorder(root->lchild);
//遍歷右子樹
postorder(root->rchild);
printf("%c\t", root->data);
}int main()
{ //建立節點
bitnode a, b, c, d, e,f,g,h,i,j,k;
memset(&a,0,sizeof(bitnode));
memset(&b, 0, sizeof(bitnode));
memset(&c, 0, sizeof(bitnode));
memset(&d, 0, sizeof(bitnode));
memset(&e, 0, sizeof(bitnode));
memset(&f, 0, sizeof(bitnode));
memset(&g, 0, sizeof(bitnode));
memset(&h, 0, sizeof(bitnode));
memset(&i, 0, sizeof(bitnode));
memset(&j, 0, sizeof(bitnode));
memset(&k, 0, sizeof(bitnode));
a.data = 'a';
b.data = 'b';
c.data = 'c';
d.data = 'd';
e.data = 'e';
f.data = 'f';
g.data = 'g';
h.data = 'h';
i.data = 'i';
j.data = 'j';
k.data = 'k';
//建立聯絡
a.lchild = &b;
a.rchild = &c;
b.lchild = &d;
b.rchild = &e;
d.lchild = &h;
h.rchild = &k;
c.lchild = &f;
c.rchild = &g;
f.lchild = &i;
g.rchild = &j;
//樹的遍歷
//前序遍歷演算法
printf("前序遍歷演算法\n");
preorder(&a);
printf("\n中序遍歷演算法\n");
inorder(&a);
printf("\n後遍歷演算法\n");
postorder(&a);
system("pause");
return 0;
口訣:
dlr—先序遍歷,即先根再左再右
ldr—中序遍歷,即先左再根再右
lrd—後序遍歷,即先左再右再根
資料結構與演算法 二叉樹,前序,後續,中序遍歷
樹的幾個重要元素 1,節點 樹裡面的元素 2,父子關係 節點之間相連的關係 3,子樹 當節點大於1是,其餘不相交的節點的集合稱作子樹 4,度 乙個節點擁有子樹的數量稱作度 5,孩子 節點的子節點 6,雙親節點 7,兄弟節點 9,森林 由n個不相交的樹組成 節點的高度 節點到葉子節點的最長路徑 節點的...
資料結構 樹的前序 中序 後續遍歷的非遞迴寫法
理解的精髓在於用 棧 來取代遞迴,出棧的操作其實就相當於某層遞迴的出口 前序遍歷 用棧來替代遞迴的過程 因為遞迴歸根到底也是用棧來實現的 考慮遞迴的時候 每進入乙個遞迴都會往左子樹試探,因此一直往左子樹走到頭,遇到乙個節點就訪問它 然後壓入棧中 訪問完左子樹之後再回過頭繼續對每個節點的右子樹進行 遞...
演算法4 用python實現前序中序後續遍歷二叉樹
建立乙個二叉樹 宣告乙個二叉樹節點類 節點中包括 節點值,節點左子樹根節點,節點右子樹根節點,節點父節點 class treenode def init self,value none,leftnode none,rightnode none,parentnode none self.val val...