劍指offer 重建二叉樹

2021-07-25 12:36:21 字數 1216 閱讀 6996

問題描述:

/*輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍

曆的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。*/

思路:

1. 前序遍歷序列 prev ;

中序遍歷序列 vin ;

2. 前序:根左右 : 前序往後走是先往左走, 左完了之後才是右

中序:左根右。 中序往上走是先往根走,

在此之前。需要明白:前序的第乙個節點就是中序的根結點,所以: 1 的左邊是其左子樹 右邊是其右子樹

3. 從而得到了大概的粗略的左右子樹,但畢竟僅僅由上面是無法知道1的左右子樹是怎樣的排列細節

接下來可以這樣想:依靠上面的方式我得到了乙個粗略的左右子樹,那如果我將vin順序表按前面得到的粗略的左右子樹分為兩個縮小的順序表,再根據prev順序表得到其下乙個元素,這個元素對應到縮小後的vin中,不就可以再次得到乙個縮小之後的左右子樹嗎?重複上面的3過程,類似於子問題,所以下面用遞迴實現。

#pragma once 

#include

#include

using

namespace

std;

struct treenode

};class solution

treenode* _reconstructbinarytree(vector

pre, vector

vin,size_t& index)

else

for (int j = 0; j < i; j++)

for (int j = i+1; jleft = _reconstructbinarytree(pre,vleft,index);

_root->right = _reconstructbinarytree(pre, vright, index);

return _root;}}

};void test()

; vector

p(pre,pre+8);

int vin[8] = ;

vector

v(vin,vin+8) ;

solution s;

s.reconstructbinarytree(p,v);

}

劍指offer 重建二叉樹

重建二叉樹2.cpp 定義控制台應用程式的入口點。題目描述 輸入乙個二叉樹的前序遍歷和中序遍歷,輸出這顆二叉樹 思路 前序遍歷的第乙個節點一定是這個二叉樹的根節點,這個節點將二叉樹分為左右子樹兩個部分,然後進行遞迴求解 include stdafx.h include vector using na...

《劍指offer》重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,則重建二叉樹並返回。輸入乙個樹的前序和中序,例如輸入前序遍歷序列和中序遍歷序列 根據輸入的前序和中序,重建乙個該二叉樹,並返回該樹的根節點。definition for binary...

劍指offer 重建二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。definition for binary tree struct treenode class solution if ...