排序二叉樹及其遍歷

2021-04-01 18:12:17 字數 2798 閱讀 7364

所謂建立排序二叉樹就是,就是將各結點資料元素順序插到一棵二叉樹中,在插入的過程中,始終保持二叉樹中每個結點的值都大於其左子樹上每個結點的值,而小於或等於其右子樹上每個結點的值,每個結點資訊包括結點資料(結點值)、左子樹指標、右子樹指標。

程式執行的過程中,

bt指標始終指向根結點,

p指標指向當前已找到的結點,

q指標不斷向下尋找新的結點。

為實現二叉樹的非遞迴演算法,需要設定乙個棧來儲存指向結點的指標,以便在遍歷某結點的左子樹後,由這個指標能找到該結點的右子樹。棧中的位址是隨著結點的遍歷次序而動態變化的。

參考程式

:#include

#define  null 0

#define  max 100

int counter=0;

int stack[max],top=0;

typedef struct btreenode

bnode;

bnode *creat(int x,bnode *lbt,bnode *rbt)               //

建立乙個只有根結點的二叉樹

bnode *inslchild(bnode *p,int x)                                //x

作為左孩子插入到二叉樹中

}bnode *insrchild(bnode *p,int x)

}void prorder(bnode *p)                                //

輸出二叉樹的結構

void print(bnode *p)                             //

巢狀括號表示二叉樹,輸出左子樹前列印左括號,}}

void preorder(bnode *p)                       //

前序遍歷

else}}

void inorder(bnode *p)                         //

中序遍歷

p=(bnode*)pop();

printf("%d",p->data);                          //

輸出當前結點值

p=p->rchild;                                          //

遍歷右子樹}}

void postorder(bnode *p)                //

後序遍歷

else

while(top!=0)

else

if(sign==2)                                      //sign=2表示p

的左右子樹都已走完

} //while(top!=0)

} //while(p!=null||top!=0)

}void translevel(bnode *p)               //

層次遍歷

q;q.front=q.rear=0;

if(p!=null)

printf("%d",p->data);

q.vec[q.rear]=p;                              //

結點指標進入佇列

q.rear=q.rear+1;

while(q.front佇列不為空

if(p->rchild!=null)}}

push(s)

pop()

main()

if(x==p->data)

printf("the node %d  existed already!/n",x);

else

if(xdata)

inslchild(p,x);

else

insrchild(p,x);

scanf("%d",&x);

}p=bt;

printf("structure of the binary tree:/n");

printf("number/taddress/tdata/tlchild/trchild/n");

prorder(p);

printf("/n");

print(p);

printf("/t

輸出左子樹前列印左括號,輸出右子樹後列印右括號。

/n");

printf("----------1

前序遍歷二叉樹

---------- /n");

printf("----------2

中序遍歷二叉樹

---------- /n");

printf("----------3

後序遍歷二叉樹

---------- /n");

printf("----------4

層次遍歷二叉樹

---------- /n");

loop:printf("

請選擇遍歷方式:

");scanf("%d",&y);

switch(y)

}       

容易看出,中序遍歷二叉樹可得到乙個關鍵字的有序序列,乙個無序序列可以通過構造一棵二叉排序樹而變成乙個有序序列,構造樹的過程即對無序序列進行排序的過程。不僅如此,從上面的插入過程還可以看到,每次插入的新結點都是二叉排序樹的新的葉子結點,在進行插入操作時,不必移動其他結點,僅需改動某個結點的指標,由空變為非空即可。這就相當於在乙個有序序列上插入乙個記錄而不需要移動其他記錄。這有類似折半查詢的特性,又採用鍊錶作為儲存結構,因此是動態查詢的一種適宜表示。

二叉樹及其遍歷

滿二叉樹肯定是完全二叉樹,完全二叉樹不一定是滿二叉樹 二叉樹的遍歷 先序遍歷 也叫做先根遍歷 前序遍歷,首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹,如果二叉樹為空則返回。中序遍歷 首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。...

二叉樹及其遍歷

二叉樹是乙個很重要的儲存結構,所以和大家分享一下我對二叉樹的理解並結合 希望讓大家都能對二叉樹有乙個最清晰的認識 首先,二叉樹是每個節點最多有兩個子樹的樹結構,這是二叉樹的定義,二叉樹的結構如下圖 可以看到二叉樹必要的是根節點,也就是a,每個節點都會有左子節點和右子節點,那麼從b開始看,它又是乙個二...

二叉樹及其應用 二叉樹遍歷

給定二叉樹的廣義表表示,構造二叉樹並輸出二叉樹的四種遍歷順序。輸入說明 輸入僅一行,該行僅由 以及大小寫字元構成的二叉樹的廣義表表示,字串長度不超過100。輸出說明 在接下來的四行中依行輸出二叉樹的四種遍歷 輸入樣列 a b d,c e,f h 輸出樣列 abdcefh dbaecfh dbehfc...