二叉樹的前,中,後序遍歷 以及通過補『#』字元補充二叉樹空分支,按照前序順序構造二叉樹,
這些都比較簡單,我這就不過多地贅述;直接貼**
#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 這...