劍指Offer 構建二叉樹

2021-09-21 02:14:18 字數 2150 閱讀 7929

題目描述

輸入某二叉樹的前序遍歷和中序遍歷結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不包含重複的數字。例如輸入前序遍歷序列:和中序遍歷,則重建出圖中所示二叉樹並且輸出它的頭結點。

解題思路

演算法**

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

* 假設輸入的前序遍歷和中序遍歷的結果中都不包含重複的數字。

* 例如輸入前序遍歷序列:和中序遍歷,

* 則重建出圖中所示二叉樹並且輸出它的頭結點。

*/public

class

offer7

;int inorder=

; offer7 constructbinarytree =

newoffer7()

; binarytreenode node = constructbinarytree.

construct

(preorder, inorder, preorder.length)

;// 前序列印

printprebinarytree

(node);}

/** * 初始化判斷

** @param preorder

* @param inorder

* @param prelength

* @return

*/public binarytreenode construct

(int preorder,

int inorder,

int prelength)

else

return binarytreenode;

}/**

* 區分左右子樹,找出根節點核心

** @param preorder

* @param startpreindex

* @param endpreindex

* @param inorder

* @param startinindex

* @param endinindex

* @return

*/public binarytreenode coreconstruct

(int

preorder,

int startpreindex,

int endpreindex,

int[

] inorder,

int startinindex,

int endinindex)

else

// 左子樹長度

int letftreelength = rootinindex - startinindex;

// 左子樹右端值

int leftpreendindex = startpreindex + letftreelength;

// 構建左子樹

if(letftreelength >0)

// 如果左子樹長度小於 先序遍歷的元素個數 說明存在右子樹

if(letftreelength < endpreindex - startpreindex)

return rootnode;}}

// 按照前序遍歷列印二叉樹的節點

public

static

void

printprebinarytree

(binarytreenode root)

else

if(root.lefttree != null)

if(root.righttree != null)}}

/** * 二叉樹資料結構

*/class

binarytreenode

}附錄

該題原始碼在我的 ?github 上面!

劍指offer 二叉樹 二叉樹搜尋樹

package bst import j a.util.public class bst if pre.length 0 in.length 0 treenode root new treenode pre 0 for int i 0 i in.length i return root 判斷給定陣列...

劍指offer 平衡二叉樹

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹 1 重複遍歷結點 參考上一題求二叉樹的深度,先求出根結點的左右子樹的深度,然後判斷它們的深度相差不超過1,如果否,則不是一棵二叉樹 如果是,再用同樣的方法分別判斷左子樹和右子樹是否為平衡二叉樹,如果都是,則這就是一棵平衡二叉樹。但上面的方法在判斷子樹是否...

劍指offer 重建二叉樹

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