1. 程式人生 > >根據中序遍歷和後序遍歷重建二叉樹

根據中序遍歷和後序遍歷重建二叉樹

二叉樹的重建

二叉樹的重建方法: 一、根據前序加中序遍歷重建二叉樹 構造該二叉樹的過程如下:
1. 根據前序序列的第一個元素建立根結點;
2. 在中序序列中找到該元素,確定根結點的左右子樹的中序序列;
3. 在前序序列中確定左右子樹的前序序列;
4. 由左子樹的前序序列和中序序列建立左子樹;
5. 由右子樹的前序序列和中序序列建立右子樹。
二、根據中序加後序遍歷重建二叉樹 構造該二叉樹的過程如下:
1. 根據後序序列的最後一個元素建立根結點;
2. 在中序序列中找到該元素,確定根結點的左右子樹的中序序列;
3. 在後序序列中確定左右子樹的後序序列;
4. 由左子樹的後序序列和中序序列建立左子樹;
5. 由右子樹的後序序列和中序序列建立右子樹。
三、前序加後序 前序和後序在本質上都是將父節點與子結點進行分離,但並沒有指明左子樹和右子樹的能力,因此得到這兩個序列只能明確父子關係,而不能確定一個二叉樹。
下面是一棵二叉樹:

前序遍歷:1 2 4 3 5 7 6 
中序遍歷:2 4 1 5 7 3 6
後序遍歷:4 2 7 5 6 3 1
前序+中序重建二叉樹
#include<stdio.h>
#include<stdlib.h>

typedef struct node{
	int data;
	struct node *lchild,*rchild;
}bitree;

void rebuild(int *prelist,int *inlist,int n,bitree **t)
{
	if(!prelist || !inlist || n<=0 )		//空樹 
		return;
	int i;
	
	//找到根結點在中序遍歷中的位置 
	for(i = 0; i < n; i++)
	{
		if(inlist[i] == prelist[0])			
			break;					 
	} 
	
	if(i>=n)
		return;
	
	//初始化根結點 
	*t = (bitree*)malloc(sizeof(bitree));
	if(!t)
		return;
	(*t)->lchild = (*t)->rchild = NULL;
	(*t)->data = prelist[0];
	
	//重建左子樹
	rebuild(prelist+1,inlist,i,&(*t)->lchild); 
	//重建右子樹 
	rebuild(prelist+i+1,inlist+i+1,n-i-1,&(*t)->rchild);
}

void postOrderTraverse(bitree *t)
{	//	後序遍歷 
	if(t)
	{
		postOrderTraverse(t->lchild);
		postOrderTraverse(t->rchild);
		printf("%d ",t->data);
	}
}

int main()
{
	int pre[] = {1,2,4,3,5,7,6};
	int in[] = {2,4,1,5,7,3,6};
	
	bitree *t = NULL;
	rebuild(pre,in,7,&t); 
	postOrderTraverse(t);
	
	return 0;
} 


中序+後序重建二叉樹:
void rebuild(int *inlist,int *postlist,int n,bitree **t)
{
	if(!inlist || !postlist || n<=0 )		//空樹 
		return;
	int i;
	
	//找到根結點在中序遍歷中的位置 
	for(i = 0; i < n; i++)
	{
		if(inlist[i] == postlist[n-1])			
			break;					 
	} 
	
	if(i>=n)
		return;
	
	//初始化根結點 
	*t = (bitree*)malloc(sizeof(bitree));
	if(!t)
		return;
	(*t)->lchild = (*t)->rchild = NULL;
	(*t)->data = postlist[n-1];
	
			
	//重建左子樹	
	rebuild(inlist,postlist,i,&(*t)->lchild); 				
	//重建右子樹 
	rebuild(inlist+i+1,postlist+i,n-i-1,&(*t)->rchild);			//post+i 
}


相關推薦

根據構造

eno build 中序遍歷樹 oot post rsa uil cnblogs 找到 根據中序遍歷和後序遍歷樹構造二叉樹 樣例: 給出樹的中序遍歷: [1,2,3] 和後序遍歷: [1,3,2] 返回如下的樹: 2 / \ 1 3 借鑒上一篇《前序遍歷和中序遍

根據重建

二叉樹的重建 二叉樹的重建方法: 一、根據前序加中序遍歷重建二叉樹 構造該二叉樹的過程如下: 1. 根據前序序列的第一個元素建立根結點; 2. 在中序序列中找到該元素,確定根結點的左右子樹的中序序列;

七:重建(依據先(或者重建

off 相同 tree int roo 節點 先序 throw -a 對於一顆二叉樹。能夠依據先序遍歷(或者後序遍歷)和中序遍歷(樹中不含反復的數字)又一次還原出二叉樹。 解析: 1. 先序遍歷序列的第一個元素必然是根節點,能夠由此獲取二叉樹的根節點。 2. 依

二叉樹 com size 基本 html 後序 href col spa 轉自:https://www.cnblogs.com/polly333/p/4740355.html 基本思想>>   先序遍歷:根——>左——>右   先序遍歷:左——>

數據結構 遞歸非遞歸方式實現

nor post 後序遍歷 order else 對象 二叉樹先序 bre print   二叉樹的先序遍歷順序是根、左、右;中序遍歷順序是左、根、右;後序遍歷順序是左、右、根。   遞歸方式實現如下: 1 public class TreeNode { 2

數據結構35:

tdi 代碼 nod 完成 循環 同時 reat pan 設置 遞歸算法底層的實現使用的是棧存儲結構,所以可以直接使用棧寫出相應的非遞歸算法。 先序遍歷的非遞歸算法 從樹的根結點出發,遍歷左孩子的同時,先將每個結點的右孩子壓棧。當遇到結點沒有左孩子的時候,取棧頂的右

72 構造

實的 dong scrip size turn -c -h red 左右子樹 原題網址:https://www.lintcode.com/problem/construct-binary-tree-from-inorder-and-postorder-traversal/d

用遞歸非遞歸方式實現的先

壓入 功能 指南 void 一個 兩個 方法 img oid 很久沒寫博客了,也很久沒有靜下心來學習技術,具體原因不再多糾結。 最近完成零丁任務之余每天刷一刷LeetCode,看看書(比如這篇記錄的是左程雲大佬的《程序員代碼面試指南》中的內容) 溫習和學習一些算法以及相關知

刷題筆記4——根據重建

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 分析 在前序遍歷中,第一個數字總

求類層

PTA-ZigZagging on a Tree (25 分) Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determin

3.1分別用遞迴非遞迴方式實現

題目 用遞迴和非遞迴方式,分別按照二叉樹先序、中序和後序列印所有的節點。 首先給出二叉樹節點結構定義: public class BinaryTreeNode { //二叉樹節點 private int data; private Bi

線索的建立、線索化(前

線索二叉樹的概念 線索二叉樹的原理:線索二叉樹是將普通二叉樹左右孩子中的空鏈域利用起來,將左孩子空鏈域指向當前節點的線性遍歷前驅,將右孩子空鏈域指向當前節點的線性遍歷後繼,指向該線性序列中的前驅或後繼

已知重建()

由中序遍歷和後序遍歷重建二叉樹 中序遍歷中,根節點總是位於左右子樹中間,將左右子樹分開。 後序遍歷中,根節點總是在左右子樹之後。 重建演算法: 現在說一下重建根節點的過程,其他節點可以遞迴建立。 由

之先

例圖:                   1.先序遍歷   先序遍歷也叫做先跟遍歷、前序遍歷。先序遍歷步驟為:訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左、右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。即根左右。   如上圖1,先序遍歷的序列為:

java編寫以及前

/** * 實現二叉樹的建立、前序遍歷、中序遍歷和後序遍歷 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All right reserved * created on 2014

(1)建立二叉樹二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先中序和後序遍歷的遞迴非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。 (4)求二叉樹的所有葉子及結點總數。

(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。(4)求二叉樹的所有葉子及結點總數。 include<stdio.h> #inclu

劍指Offer-根據的前重建

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。  * 假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。  * 例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}  * 和中序遍歷序列{4,7,2,1,5,3,8,6},  * 則重建二叉樹並返回/*思

重建根據結果)

public TreeNode reConstructBinaryTree(int [] pre,int [] in) {         return build(pre,0,pre.length-1,in,0,in.length-1);     }     public TreeNode build(in

的前(python實現)

# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # sel

LintCode(72)構造

題目  中序遍歷和後序遍歷樹構造二叉樹 根據中序遍歷和後序遍歷樹構造二叉樹 樣例 給出樹的中序遍歷: [1,2,3] 和後序遍歷: [1,3,2] 返回如下的樹:   2  /