通過序列構建二叉樹

2021-08-14 13:23:20 字數 2270 閱讀 2751

示意圖:

根據示意圖可以得到如下**:

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...