1. 程式人生 > >由前序遍歷和中序遍歷重建二叉樹(前序序列:1 2 3 4 5 6

由前序遍歷和中序遍歷重建二叉樹(前序序列:1 2 3 4 5 6

由前序遍歷和中序遍歷重建二叉樹
前序序列(根-左-右):1 2 3 4 5 6
中序序列(左-根-右):3 2 4 1 6 5
1、由前序遍歷可知根節點為第一個元素1,在中序遍歷序列中找到1對應位置,則1的左邊就是左子樹324,右邊就是右子樹65;
2、在找到前序遍歷序列中從第二個位置開始往後找相同數目的節點為左子樹234,剩餘的就是右子樹序列65;
3、根據前序遍歷規則可知,左子樹序列裡第一個就是左子樹的根節點2,右子樹序列裡的第一個就是有右子樹的根節點5;
4、根據中序遍歷序列可知,左子樹的根節點2左邊的一定是以其為根節點的左子樹序列3,右邊就是以其為根節點的右子樹序列4,右子樹的根節點5左邊的一定是以其為根節點的右子樹序列6

struct BinaryTreeNode
{
int _data;
BinaryTreeNode * _pLeftChild;
BinaryTreeNode* _pRighChild;
};

BinaryTreeNode* RebuildBinaryTree(int* PreOder, int*InOrder, int length)
{
if (PreOder == NULL || InOrder == NULL || length <= 0)
return NULL;
_RebuildBinaryTree(PreOder, PreOder + length - 1, InOrder, InOrder + length - 1
); } BinaryTreeNode* _RebuildBinaryTree(int* startPre, int* endPre, int* startIn, int* endIn) { //根據前序遍歷儲存根節點 BinaryTreeNode *pRoot; pRoot = new BinaryTreeNode(); pRoot->_data = startPre[0]; pRoot->_pLeftChild = NULL; pRoot->_pRighChild = NULL; //判斷是否找完了此次中序遍歷,若是找完了,則返回pRoot; if (startIn == endIn&&*startIn == *endIn) return
pRoot; //在中序遍歷中找根節點所在的位置 int* pRootIn = startIn; while (*startPre != *pRootIn) pRootIn++; //根據根節點在中遍歷中的位置,遞迴還原左子樹 int leftlen = pRootIn - startIn; if (leftlen > 0) { pRoot->_pLeftChild = _RebuildBinaryTree(startPre + 1, startPre + leftlen, startIn, startIn + 1); } //左子樹長度加上中序的起始位置後若仍小於整個中序長度,則說明該節點右子樹存在,遞迴還原右子樹 if (leftlen + startIn < endIn) { pRoot->_pRighChild = _RebuildBinaryTree(startPre+leftlen+1,endPre,startIn+leftlen+1,endIn); } return pRoot; }

相關推薦

重建序列1 2 3 4 5 6

由前序遍歷和中序遍歷重建二叉樹 前序序列(根-左-右):1 2 3 4 5 6 中序序列(左-根-右):3 2 4 1 6 5 1、由前序遍歷可知根節點為第一個元素1,在中序遍歷序列中找到1對

山科java實驗3-3編寫一個方法,返回一個double型的維陣列,陣列的元素通過解析字串引數獲得。例如,字串引數1,2;3,4,5;6,7,8”,對應的陣列為 d[0,0

編寫一個方法,返回一個double型的二維陣列,陣列中的元素通過解析字串引數獲得。例如,字串引數:“1,2;3,4,5;6,7,8”,對應的陣列為:       d[0,0] = 1.0  d[0,1

ACMNO.21 C語言-逆輸出 輸入10個數字,然後逆輸出。 輸入 十個整數 輸出 逆輸出,空格分開 樣例輸入 1 2 3 4 5 6 7 8 9 0

題目描述 輸入10個數字,然後逆序輸出。 輸入 十個整數 輸出 逆序輸出,空格分開 樣例輸入 1 2 3 4 5 6 7 8 9 0 樣例輸出 0 9 8 7 6 5 4 3 2 1 提示 陣列?堆疊? 來源/分類 C語言

c語言 對10個數組元素依次賦值為0 1 2 3 4 5 6 7 8 9,要求按逆輸出

                對10個數組元素依次賦值為0,1,2,3,4,5,6,7,8,9,要求按逆序輸出。 解:程式:

python練習題,寫一個方法 傳進去列表預期的value 求出所有變量得取值可能性例如list為[1,2,3,4,5,6,12,19],value為20,結果是19+1==20只有一種可能性),要求時間復雜度為O(n)

num bubuko com pri def 代碼 data- 取值 .com 題目:(來自光榮之路老師)a+b==valuea+b+c=valuea+b+c+d==valuea+b+c+d+...=valuea和b....取值範圍都在0-value寫一個方法 傳進去列

計算第K個能表示(2^i * 3^j * 5^k)的正整數i,j,k為整數)?其7個滿足此條件的數分別是1,2,3,4,5,6,8

public class Main { public static void main(String[] args) { int[] a = new int[1501]; a[1] = 1; TreeMap<Integer, Integ

重建根據結果)

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

重建依據先或者後重建

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

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

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

從上往下列印 )JS演算法

   從上往下打印出二叉樹的每個節點,同層節點從左至右列印  //給定節點結構 /* function TreeNode(x) {     this.val = x;     this.left = nul

已知重建未完)

#include<iostream> #include<malloc.h> using namespace std; struct node{ struct node *right,*left; int e; }; const int maxn=30; int p

資料結構-線索線索

後序線索二叉樹 線索化的概念及相關圖解 在上一篇中詳細介紹了中序線索二叉樹,線索化圖解及相關概念都放在那篇部落格啦,放個傳送門 線索二叉樹詳細解析(含圖解):傳送門 包括還有先序線索二叉樹:傳送門 後序線索二叉樹 (1)後序線索二叉樹的構造

一個棧的輸入列為1 2 3 4 5 的出站順序的理解

 一個棧的輸入序列為1 2 3 4 5 的出站順序是什麼?這個經常會在面試的時候出現。如何判斷棧的進出問題一個棧的輸入序列為1 2 3 4 5,則下列序列中不可能是棧的輸出序列的是( )A. 2 3 4

擴充套件序列建立擴充套件序列建立

題目:設計並驗證如下演算法:按後序序列建立二叉樹的二叉連結串列結構,求其單分支結點數目,雙分支結點數目,並交換該二叉樹。後序序列建立二叉樹需要藉助棧,棧的定義如下stack.h#include<stdio.h> #include<stdlib.h> #

將一個整形陣列逆,如陣列a[5]={1,2,3,4,5},逆之和陣列a變成了{5,4,3,2,1};

方法一: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include&

練習1+2+3+4+5...100的

hid 技術 one brush src log display 分享 code 求1+2+3+4+5...100的和方法一 count = 1 s1 = 0 while count <= 100:

python入門1-2+3-4+5...99的所有數的自寫)

== 余數 奇數 nbsp int 當前 pre span bre 1 #!/usr/bin/env pyhton 2 # -*- coding:utf-8 -*- 3 #求1-2+3-4+5...99的所有數的和(自寫) 4 """ 5 給x賦值為0,給y賦值

python入門1-2+3-4+5...99的所有數的

== python入門 ... sta rt+ color python while style 1 start =1 2 sum =0 3 while start <100: 4 if start % 2 ==0: 5 sum =sum -

1-2+3-4+5 ... 99的所有數的

file demo1 elif int sof usr software == python #!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/5/6 0006 12:06# @Author : A