資料結構 前序,中序 後續序歷演算法(c語言)

2021-08-19 13:37:31 字數 4798 閱讀 1263

#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...