根據中序遍歷和後序遍歷重建二叉樹
二叉樹的重建
二叉樹的重建方法: 一、根據前序加中序遍歷重建二叉樹 構造該二叉樹的過程如下: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 /