問題描述:/*輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍
曆的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。*/
思路:
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 ...