輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
演算法設計思想:
前序遍歷序列的第乙個元素為根結點的值,然後在中序遍歷序列中尋找根節點的值的位置(索引)。
從中序遍歷序列的起始位置到根結點的值的位置(不包含)為根結點左子樹的中序遍歷序列;從中序遍歷序列的根結點的值的位置(不包含)到結束位置為根結點右子樹的中序遍歷序列;相應的,從前序遍歷序列的第二個元素開始的根結點左子樹結點數個元素的子串行為根結點左子樹的前序遍歷序列,從下乙個元素開始,直到結束位置的子串行為根結點右子樹的前序遍歷序列。如圖 2.7 所示,
採用了遞迴的思路進行求解,既然採用了遞迴,自然要有返回條件,返回條件無非就是當len(left_tree) = 0 or 1
以及len(right_tree) = 0 or 1
的時候,**實現如下:
# -*- coding:utf-8 -*-
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
:# 返回構造的treenode根節點
defreconstructbinarytree
(self, pre, tin)
:# write code here
# note: the input of pre and tin are list, so we can directly use
# the number of list to construct the binary tree.
iflen
(pre)==0
orlen
(tin)==0
:return
iflen
(pre)==1
:return treenode(pre[0]
)iflen(tin)==1
:return treenode(tin[0]
) root_index = tin.index(pre[0]
) left = tin[
0: root_index]
right = tin[root_index+1:
] root = treenode(pre[0]
) root.left = self.reconstructbinarytree(pre[
1:root_index+1]
, tin[
:root_index]
) root.right = self.reconstructbinarytree(pre[root_index+1:
], tin[root_index+1:
])return root
c++ version:
struct treenode };
class
solution
;for
(auto i =
0; i < vin.
size()
; i++)}
return root;}}
;
#include
#include
#include
//注意要包含該標頭檔案
using
namespace std;
intmain()
;int num_to_find =5;
int start =0;
int end =5;
int* result =
find
( nums + start, nums + end, num_to_find );if
( result == nums + end )
else
return0;
}
劍指offer4 重建二叉樹
給出前序遍歷和中序遍歷,重新構建二叉樹.重建二叉樹主要就是遞迴,每一次新增乙個結點進入二叉樹,保證遞迴的順序和前序遍歷順序一致就ok了,多以左子樹的遞迴在前面,右子樹的遞迴放在後面,和前序遍歷的順序一致,第一次遞迴新增前序遍歷陣列中的第乙個,第二次遞迴新增的是前序遍歷陣列中的第二個.第n個就是陣列中...
劍指offer 4 重建二叉樹
題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。思路 中序序列中,節點左邊為左子樹,右邊為右子樹。前序第乙個為根節點 12 4 7 3 5 6 8 左 4 7 215 3...
劍指offer 4 重建二叉樹
重建二叉樹 include include 重建二叉樹 using namespace std struct treenode static void preorder treenode root cout root val preorder root left preorder root righ...