二叉樹常用操作(建立 查詢 求高度 遍歷 列印)

2021-07-08 22:22:01 字數 1961 閱讀 7996

/*

author:ibsen

data:2015.12.15

*///二叉樹建立、查詢、求高度、7種遍歷、列印輸出

#include #include #include using namespace std;

const int m=1000; //定義節點最大值

//定義鏈式儲存結構

typedef struct node

btree;

char str[m]; //括號表示法存放二叉樹

/*********************====

建立二叉樹

假設採用括號表示法表示的二叉樹字串str正確,用ch掃瞄str只有四種字串:

1.若ch=='(':表示前面剛建立的節點*p存在孩子節點,將其進棧,然後開始處理孩子節點,置k=1,表示其後建立的是左孩子節點;

2.若ch==')':表示以棧頂節點為根結點的子樹建立完畢,將其退棧;

3.若ch==',':表示開始處理棧頂節點的右孩子節點;

4.其他情況:只能是單個字元,表示要建立乙個節點*p,根據k值建立與棧頂節點之間的關係:k==1表示該節點是棧頂節點的左孩子節點,k==2表示右孩子節點;

*************************==*/

void creat_btree(btree* &h,char *str)

}} ch=str[++pos]; }}

//查詢節點:查詢值為x的節點並返回其指標

btree* find_node(btree *h,char x)

}//求樹的高度

int btree_height(btree *h)

}//二叉樹遍歷

/*void preorder(btree *h)

}void inorder(btree *h)

}void postorder(btree *h)}*/

/*先序遍歷非遞迴演算法:由遞迴演算法可知,先訪問根結點,再訪問左子樹,最後訪問右子樹。

因此,先將根結點進棧,在棧不為空做如下迴圈:出棧p,訪問*p節點,若其右孩子節點不

為空將右孩子節點進棧,若其左孩子節點不空再將其左孩子進棧。

*/void preorder(btree *h)

} cout

//到這兒為止,棧頂元素沒有左子樹或左子樹已訪問過

if(top>-1)

}cout

中,*h的右孩子一定剛好在訪問*h之前訪問),說明*h的右子樹均已訪問,現在應該訪問*h。

從以上過程可知:棧中儲存的是當前節點*h的所有祖先節點(均未訪問過)。

*/void postorder(btree *h)

//到這兒為止,棧頂元素沒有左孩子或左子樹均已訪問過

p=null; //p指向棧頂節點的前乙個已訪問的節點

flag=1; //表示*h的左孩字已訪問過或為空

求二叉樹高度

函式介面定義 int getheight bintree bt 其中bintree結構定義如下 typedef struct tnode position typedef position bintree struct tnode 要求函式返回給定二叉樹bt的高度值。裁判測試程式樣例 include...

求二叉樹高度

本題要求給定二叉樹的高度。函式介面定義 int getheight bintree bt 其中bintree結構定義如下 typedef struct tnode position typedef position bintree struct tnode 要求函式返回給定二叉樹bt的高度值。裁判測...

求二叉樹高度

題目來自於pta 函式介面定義 int getheight bintree bt 其中bintree結構定義如下 typedef struct tnode position typedef position bintree struct tnode 要求函式返回給定二叉樹bt的高度值。裁判測試程式樣...