二叉樹的節點型別宣告如下:
struct btnode ;
定理1任何(n>=0)個不同節點的二叉樹,都可由它的前序序列和中序序列唯一地確定。
根據前序遍歷的特點, 知前序序列(presequence)的首個元素(presequence[0])為二叉樹的根(root), 然後在中序序列(insequence)中查詢此根(root), 根據中序遍歷特點, 知在查詢到的根(root) 前邊的序列為根的左子樹的中序遍歷序列, 後邊的序列為根的右子樹的中序遍歷序列。 設在中序遍歷序列(insequence)根前邊有left個元素. 則在前序序列(presequence)中, 緊跟著根(root)的left個元素序列(即presequence[1…left]) 為根的左子樹的前序遍歷序列, 在後邊的為根的右子樹的前序遍歷序列.而構造左子樹問題其實跟構造整個二叉樹問題一樣,只是此時前序序列為presequence[1…left]), 中序序列為insequence[0…left-1], 分別為原序列的子串, 構造右子樹同樣, 顯然可以用遞迴方法解決。演算法如下:
//根據前序遍歷序列和中序遍歷序列構造二叉樹
void createbt1(btnode* &t, string pre, string
in)
char nodeval = pre[0];
int index = in.find(nodeval);
string lin = in.substr(0,index);
string rin = in.substr(index+1);
int leftchildlength = lin.length();
string lpre = pre.substr(1,leftchildlength);
string rpre = pre.substr(leftchildlength+1);
t = new btnode(nodeval);
createbt1(t->left,lpre,lin);
createbt1(t->right,rpre,rin);
}
定理2任何(n>=0)個不同節點的二叉樹,都可由它的中序序列和後序序列唯一地確定。
構造過程類似,演算法如下:
//根據中序遍歷序列和後序遍歷序列構造二叉樹
void createbt2(btnode* &t, string
in, string post)
char nodeval = post[len-1];
int index = in.find(nodeval);
string lin = in.substr(0,index);
string rin = in.substr(index+1);
int leftchildlength = lin.length();
int rightchildlength = rin.length();
string lpost = post.substr(0,leftchildlength);
string rpost = post.substr(leftchildlength,rightchildlength);
t = new btnode(nodeval);
createbt2(t->left,lin,lpost);
createbt2(t->right,rin,rpost);
}
#include
#include
#include
using
namespace
std;
struct btnode
};//根據前序遍歷序列和中序遍歷序列構造二叉樹
void createbt1(btnode* &t, string pre, string in)
char nodeval = pre[0];
int index = in.find(nodeval);
string lin = in.substr(0,index);
string rin = in.substr(index+1);
int leftchildlength = lin.length();
string lpre = pre.substr(1,leftchildlength);
string rpre = pre.substr(leftchildlength+1);
t = new btnode(nodeval);
createbt1(t->left,lpre,lin);
createbt1(t->right,rpre,rin);
}//根據中序遍歷序列和後序遍歷序列構造二叉樹
void createbt2(btnode* &t, string in, string post)
char nodeval = post[len-1];
int index = in.find(nodeval);
string lin = in.substr(0,index);
string rin = in.substr(index+1);
int leftchildlength = lin.length();
int rightchildlength = rin.length();
string lpost = post.substr(0,leftchildlength);
string rpost = post.substr(leftchildlength,rightchildlength);
t = new btnode(nodeval);
createbt2(t->left,lin,lpost);
createbt2(t->right,rin,rpost);
}//前序遍歷(遞迴)
void preorder(btnode *root)
}//中序遍歷(遞迴)
void inorder(btnode *root)
}//後序遍歷(遞迴)
void postorder(btnode *root)
} //測試用例
int main()
執行結果如下:
二叉樹 根據遍歷構造二叉樹
二叉樹中的三種遍歷方式,是我們最為熟知的,通過先序遍歷 中序遍歷或者是中序遍歷 後序遍歷都可以唯一確定一棵二叉樹 但是注意,先序遍歷 後序遍歷不能確定一棵二叉樹,但是如果一棵二叉樹中只有度為0和度為2的節點,那麼這種遍歷方式也是可以確定一棵確定的二叉樹的。先序 中序 構造二叉樹 下面我們分別來看一下...
二叉樹 根據序列建樹
include include using namespace std typedef struct node btnode 最好先在稿紙上寫出a0.ak,ak 1.an 1的序列,找到左右子樹的起點和終點 void create btnode t,char pre,char in,int n n為...
二叉樹 二叉樹遍歷 根據先序建立二叉樹
題目描述 編乙個程式,讀入使用者輸入的一串先序遍歷字串,根據此字串建立乙個二叉樹 以指標方式儲存 例如如下的先序遍歷字串 abc de g f 其中 表示的是空格,空格字元代表空樹。建立起此二叉樹以後,再對二叉樹進行中序遍歷,輸出遍歷結輸入 輸入包括1行字串,長度不超過100。輸出 可能有多組測試資...