二叉樹的基本操作及四種排序

2021-06-27 02:41:44 字數 3261 閱讀 7387

二叉樹的基本操作:"二叉樹基本操作.cpp"

首先定義二叉鏈式結構:

#include #include #define queue_maxsize 50   //佇列大小

typedef char data; //定義元素型別

typedef struct chaintree

chainbintree;

然後對乙個二叉樹進行初始化,即將已有的乙個結點設定為二叉樹根結點

chainbintree *bintreeinit(chainbintree *node)    //初始化二叉樹根結點

node為乙個二叉樹結點的指標,若node結點不空,返回該結點指標的值作為二叉樹的根結點

新增結點到二叉樹:

int bintreeaddnode(chainbintree *bt,chainbintree *node,int n)  //新增結點

//bt為父結點,node為子結點,n=1表示新增到左子樹,n=2表示新增到右子樹

switch(n)

else //父結點bt的左子樹為空,將結點node新增到左子樹

bt->left=node;

break;

case 2:

if(bt->right) //右子樹不為空

else

bt->right=node; //結點node新增到右子樹

break;

default:

printf("引數錯誤\n");

return 0;

}return 1; //1表示新增成功

}

獲取二叉樹的左右子樹:

chainbintree *bintreeleft(chainbintree *bt)  //返回左子結點

chainbintree *bintreeright(chainbintree *bt) //返回右子結點

計算樹的深度

int bintreedepth(chainbintree *bt)    //求二叉樹深度

}

在二叉樹中查詢,需要遍歷二叉樹的每乙個結點,逐個比較資料,當找到目標資料時,返回資料所在的結點指標

chainbintree *bintreefind(chainbintree *bt,data data);  //在二叉樹中找值為data的結點

}}

清空二叉樹:在向二叉樹新增結點時,每個結點都是由malloc函式申請分配記憶體,清空時用free釋放

void bintreeclear(chainbintree *bt)   //清空二叉樹,

return;

}

二叉樹的遍歷:

遍歷是對二叉樹的基本操作,所謂遍歷二叉樹就是按照一定規則和順序走遍二叉樹所有子樹,使每乙個結點都被訪問一次

遍歷有四種方法:先序遍歷,中序遍歷,後序遍歷,按層遍歷。

對下圖:d(data)表示根節點,l(left)表示左子樹,r(right)表示右子樹

先序遍歷(dlr):先訪問根節點,在按先序遍歷左子樹,最後按先序遍歷右子樹

中序遍歷(ldr):先按中序遍歷左子樹,再訪問根結點,最後按中序遍歷右結點

後序遍歷(lrd):先後序遍歷左子樹,再後序遍歷右子樹,最後再訪問根結點

先序遍歷:

//先序遍歷

void bintree_dlr(bintree)

return; //遞迴結束

}

bt為需要遍歷的根結點,函式oper是乙個需要對結點進行操作的函式。

中序遍歷:

//中序遍歷

void bintree_ldr(bintree)

return;

}

後序遍歷:

//後序遍歷

void bintree_lrd(bintree)

return;

}

對下圖:

先序遍歷後各結點順序:a,b,d,h,i,e,j,k,c,f,l,g。

中序遍歷後各節點順序:h,d,i,b,j,e,k,a,l,f,c,g

後序遍歷後各結點順序:h,i,d,j,k,e,b,l,f,g,c,a

按層遍序:對上面所示的二叉樹,共有四層,按層遍歷得到的順序就是:a,b,c,d,e,f,g,h,i,j,k,l

由於二叉樹按層遍歷,使用迴圈佇列進行處理,實現逐層遍歷:

//按層遍歷

void bintree_level(chainbintree *bt,void (*oper)(chainbintree *p))

while(head!=tail) //佇列不為空,進行迴圈

if(p->right!=null) //結點有右子樹;右子樹指標進隊

} return;

}

首先從根結點開始,每層的結點逐步進入佇列,這樣就可得到按層遍歷的效果。

#include
#include#include "二叉樹基本操作.cpp"

void oper(chainbintree *p) //操作二叉樹結點的資料

chainbintree *initroot() //建立二叉樹根結點

return null;

}void addnode(chainbintree *bt) //給二叉樹新增子結點

printf(1.新增到左子樹\n 2.新增到右子樹\n);

dowhile(select!=1&&select!=2); }

return;

} int main()

}while(select!='0');

bintreeclear(root); //清空二叉樹

root=null;

return 0;

}

二叉樹四種遍歷方式

二叉樹的四種遍歷方式 include include using namespace std 二叉樹節點的定義 class treenode 遞迴方式,每個結點只遍歷一次,時間複雜度o 1 遞迴最多呼叫n次,空間複雜度o n 先序 根 遞迴左 遞迴右 void preorder treenode r...

二叉樹的四種遍歷方式

前言最近做題用到很多次二叉樹的遍歷,因此寫這篇文章記錄二叉樹的四種遍歷方式。首先為了方便,先假設二叉樹的結構如下 struct treenode 對於程式的輸入為 3 根節點root 9 20 4 10 15 71.二叉樹的層次遍歷 層次遍歷就是依次遍歷樹的每一層。借助佇列,可以輕鬆實現。void ...

二叉樹的四種遍歷方式

二叉樹是一種很常見的資料結構,其結構如下圖 下面接受他的四種遍歷方式 前提 這裡先給出測試中的二叉樹結構,如下圖所示 該二叉樹對應的幾種遍歷方式的結果順序 先序遍歷 10 6 4 8 14 12 16 中序遍歷 4 6 8 10 12 14 16 後序遍歷 4 8 6 12 16 14 10 層次遍...