資料結構 後序建立二叉樹

2021-08-20 03:32:27 字數 2737 閱讀 1001

二叉樹的前,中,後序遍歷 以及通過補『#』字元補充二叉樹空分支,按照前序順序構造二叉樹,

這些都比較簡單,我這就不過多地贅述;直接貼**

#include "stdafx.h"

#includeusing namespace std;

typedef char datatype;

typedef struct node

btnode; //二叉樹結點型別

//初始化空二叉樹

void treeinit(btnode * &root);

//按照前序遍歷序列建立二叉樹

void createbtree_pre(btnode * &root, datatype array);

//前序遍歷二叉樹

void preorder(btnode * root);

//中序遍歷二叉樹

void inorder(btnode * root);

//後序遍歷二叉樹

void postorder(btnode * root);

//計算二叉樹的深度

int btreedepth(btnode * root);

//釋放二叉樹中所有結點

void clearbtree(btnode * &root);

#include"stdafx.h"

#include"bitree.h"

//初始化空二叉樹

void treeinit(btnode * &root)

//按照前序遍歷序列建立二叉樹

void createbtree_pre(btnode * &root, datatype array)

else }

//前序遍歷二叉樹

void preorder(btnode * root)

}//中序遍歷二叉樹

void inorder(btnode * root)

}//後序遍歷二叉樹

void postorder(btnode * root)

}//釋放二叉樹中所有結點

void clearbtree(btnode * &root)

}//計算二叉樹的深度

配合這張以及測試**,我相信應該比較好理解二叉樹的三種遍歷順序以及前序構造二叉樹;

好,下面我們重點來看看另外一種構建二叉樹的方式:後序構造二叉樹

首先呢,我們得清楚乙個概念,我所謂的構建二叉樹的方式,是通過把二叉樹的後序遍歷得到的

結果存放在乙個字串中(用『#』表示二叉樹的空結點),再依據這個字串構建出相應的二叉樹

ok.清楚了我們要做什麼以後,開始動手!

參照前序遍歷順序,以及後序遍歷的特點,很自然的認為這通過兩種方式構建樹的**應該也是非常

相似的,只需要把前序遍歷**中生成根結點的部分放在生成左右孩子之後,應該能輕鬆寫出後序創

建二叉樹的函式

//按照後序遍歷序列建立二叉樹 --error

void createbtree_post(btnode * &root, datatype array)

else

}

程式一跑,馬上就斷掉了。。。

除錯跟進後發現,後序建立二叉樹,無論如何,第乙個位置一定是『#』

(後序遍歷只有遇到空結點才會停止往下延伸),那麼條件if(item == '#')root == null;

成立,程式直接斷掉。

那這就麻煩了,不僅後序建立二叉樹無解,中序建立二叉樹也無解(他們都先檢索左孩子

直到遇見空結點才返回)

顯然,這種思路是走不通的;計算機不像我們人一樣,可以通過對葉子結點的分析,一步

一步反推出整棵樹的形狀,你只有把所有資料都傳給它,它才能幫你分析出樹的模樣;換

句話說,你只有確確實實地生成了一棵樹,計算機才知道它到底長什麼樣子,而不是像我

們人類通過一樣能夠想象在頭腦中描繪出樹的模樣

很自然的,想讓計算機和我們一樣通過葉子反推出根這一方法行不通。那麼我們就讓這棵

樹從根部往下生長!

通過後序遍歷的特點我們可以發現:生成樹的字串的最後乙個字元,代表的就是它的根結

點,倒數第二個就是它的右孩子。。。很容易發現,如果我們從字串後面開始推,按照

根結點 -> 右結點 ->左節點 的順序就能通過遞迴構造出一棵二叉樹了! 

//按照後序遍歷序列建立二叉樹

void createbtree_post2(btnode * &root, datatype array)

else

}

測試**:

建立二叉樹 後序建立二叉樹

由後序遍歷可知,輸入順序是左結點 右結點 子樹根結點 比如輸入如下樹 ab cde 輸入序列為 e d b c a 思路 使用棧,對左結點和右結點進行壓棧 1.當輸入遇到非 且棧中元素大於等於2,則可以確定乙個小三角樹形,並將這個樹根作為下乙個小三角樹形的乙個子節點 2.當輸入遇到非 但棧中元素小於...

資料結構 建立二叉樹

include include define max 100 using namespace std typedef struct bnode bnode,btree btree q max btree creatree 層次輸入 rear q rear s if rear 1 root s els...

後序建立二叉樹

試題描述 採用使用者輸入元素並基於後序遍歷的方式建立乙個包含6個節點的二叉鍊錶樹,基於遍歷和交換,確保任何父節點的元素值不小於子節點。要求在遍歷函式中採用函式指標。採用後序的方法輸出二叉樹的節點 樣例輸出 cfd bea 樣例輸出 f d b e c a 應該是反了,正確是a c e b d f 這...