二叉樹的遞迴遍歷

2021-07-13 13:03:55 字數 1807 閱讀 4778

所謂二叉樹的遍歷,本質上就是沿某條搜尋路徑訪問樹中的每個結點,使得每個節點均被訪問一次,而且僅被訪問一次。

由二叉樹的基本定義可以知道,遍歷一顆二叉樹首先必須決定對根結點(n),左子樹(l),右子樹(r)的訪問順序,按照先遍歷左孩子再遍歷右孩子的原則,常見的遍歷次序有先序遍歷(nlr)中序遍歷(lnr)後序遍歷(lrn)三種遍歷演算法。

在這裡使用做個簡單的例子來說明下。 

先序遍歷的操作過程為:

開始二叉樹是否為空?結束訪問根結點先序遍歷左子樹先序遍歷右子樹yesno

那麼先序遍歷的結果應該為 

a->b->d->f->c->e

這樣根據定義便可以寫出相應的演算法描述

void preorder(bitnode* t)else

}

中序遍歷的過程為:

開始二叉樹是否為空?結束先序遍歷左子樹訪問根結點先序遍歷右子樹yesno

那麼中序遍歷的結果應該為 

b->f->d->a->c->e

這樣根據定義便可以寫出相應的演算法描述

void inorder(bitnode* t)else

}

後序遍歷的過程為:

開始二叉樹是否為空?結束先序遍歷左子樹先序遍歷右子樹訪問根結點yesno

那麼後序序遍歷的結果應該為 

f->d->b->e->c->a

這樣根據定義便可以寫出相應的演算法描述

void postorder(bitnode* t)else

}

上述演算法中,遞迴遍歷左、右子樹的順序都是固定的,只是訪問根結點的順序不同。不管採用哪種遍歷演算法,每個節點都訪問一次且僅訪問一次,故時間複雜度都是

。在遞迴遍歷中,遞迴工作棧的棧深度恰好為樹的深度,所以在最壞的情況下,二叉樹有n個結點且深度為n的單支樹,遍歷演算法的空間複雜度為

。完整**見附件

//ab#df###c#e##

#include

#include

#define maxsize 100

typedef

char elemtype;

typedef

struct bitnodebitnode, *bitree;

bitree createbitree(bitnode*);

void preorder(bitnode*);

void inorder(bitnode*);

void postorder(bitnode*);

int main(int argc, char* argv)

bitree createbitree(bitnode* t)

t=(bitnode*)malloc(sizeof(bitnode));

t->data=x;

t->lchild=createbitree(t->lchild);

t->rchild=createbitree(t->rchild);

return t;

}void preorder(bitnode* t)else

}void inorder(bitnode* t)else

}void postorder(bitnode* t)else

}

遞迴遍歷二叉樹

include include include 二叉鍊錶表示法 typedef struct tag bitnode bitnode 先序遍歷 void xianxuorder bitnode root 先根 printf c root data 左子樹 xianxuorder root lchil...

二叉樹遞迴遍歷

編寫簡單的程式對下圖二叉樹進行遍歷 先訪問根節點 printf c root ch 再遍歷左子樹 recursion root lchild 再遍歷右子數 recursion root rchild 再遍歷左子樹 recursion root lchild 先訪問根節點 printf c root ...

二叉樹的遍歷 遞迴

時間限制 1 sec 記憶體限制 128 mb 提交 18 解決 8 提交 狀態 討論版 對於二叉樹t,可以有先序遍歷 中序遍歷和後序遍歷三種遍歷方式。現在我們要求給出一棵二叉樹的先序遍歷序列和中序遍歷序列,輸出它的廣度優先遍歷序列。第一行為乙個整數t 0為每個測試用例單獨一行輸出廣度優先遍歷序列。...