所謂二叉樹的遍歷,本質上就是沿某條搜尋路徑訪問樹中的每個結點,使得每個節點均被訪問一次,而且僅被訪問一次。
由二叉樹的基本定義可以知道,遍歷一顆二叉樹首先必須決定對根結點(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為每個測試用例單獨一行輸出廣度優先遍歷序列。...