示意圖:
根據示意圖可以得到如下**:
node* create(int prel,int prer,int inl,int inr)
node* root = new node; //新建乙個結點,用來存放當前二叉樹的根節點
root->data = prearr[prel]; //新結點的資料域為根結點的值
int k;
for(k = inl;k <= inr;k++)
}int numleft = k - inl; //左子樹的結點個數
//左子樹的先序區間為[prel+1,prel+numleft],中序區間為[inl,k-1]
//返回左子樹的根結點位址,賦值給root的左指標
root->lchild = create(prel+1,prel+numleft,inl,k-1);
//右子樹的先序區間為[prel+numleft+1,prer],中序區間為[k+1,inr]
//返回右子樹的根結點位址,賦值給root的右指標
root->rchild = create(prel+numleft+1,prer,k+1,inr);
return root; //返回根結點的位址
}
思想同上,只不過在後序序列中最後乙個結點才是二叉樹的根結點示例**:
node* create(int postl,int postr,int inl,int inr)
node* root = new node;
root->data = postarr[postr];
int k;
for(k = inl;k <= inr;k++)
int numleft = k - inl;
root->lchild = create(postl,postl+numleft-1,inl,k-1);
root->rchild = create(postl+numleft,postr-1,k+1,inr);
return root;
}
要構建乙個二叉樹必須給出中序序列,中序序列可以與先序序列、後序序列、層次序列中任意乙個來構建唯一的二叉樹;但後三者兩兩搭配或是三個一起都無法構建唯一的二叉樹。原因是先序、後序、層序均是提供根結點,作用是相同的都必須由中序序列來區分出左右子樹。
通過先序序列和中序序列構建二叉樹的整個程式示例**:
#include
using
namespace
std;
const
int maxn = 1000 + 5;
int prearr[maxn] = ; //先序序列
int inarr[maxn] = ; //中序序列
typedef
struct node;
node* create(int prel,int prer,int inl,int inr)
node* root = new node; //新建乙個結點,用來存放當前二叉樹的根節點
root->data = prearr[prel]; //新結點的資料域為根結點的值
int k;
for(k = inl;k <= inr;k++)
}int numleft = k - inl; //左子樹的結點個數
//左子樹的先序區間為[prel+1,prel+numleft],中序區間為[inl,k-1]
//返回左子樹的根結點位址,賦值給root的左指標
root->lchild = create(prel+1,prel+numleft,inl,k-1);
//右子樹的先序區間為[prel+numleft+1,prer],中序區間為[k+1,inr]
//返回右子樹的根結點位址,賦值給root的右指標
root->rchild = create(prel+numleft+1,prer,k+1,inr);
return root; //返回根結點的位址
}void postorder(node* root)
}int main(void)
畫出此時的二叉樹:
後序序列:4 5 2 6 3 1
程式結果:
pat上有一道類似的題:
pat1020
構建二叉樹 遍歷二叉樹
陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...
構建二叉樹
前序遍歷構建二叉樹是根據根節點 左節點 右節點的方式輸入資料,針對乙個節點來說,首先輸入的是根節點,根節點之後的數值應該是其左子節點,之後是右節點,如果是遞迴,則首先是一直設定左節點,之後再依次設定右節點。之前在看二叉樹過程中,見過最多的是輸入個位數字構建二叉樹,今天看到乙個可以輸入多個數字的輸入方...
二叉樹的遍歷以及遍歷序列構建二叉樹
lrn 後序遍歷 通過遍歷序列構造二叉樹 滿二叉樹的前序序列轉後序序列 結點結構 typedef struct node node 我們以鏈式儲存的二叉樹為例,二叉樹的遍歷有 顯然,我們所說的 序 指的是我們對結點進行訪問的先後順序 由兩個函式組成,乙個遞迴函式,以及呼叫這個遞迴函式的函式 void...