二叉搜尋樹專題

2022-02-13 12:07:48 字數 3493 閱讀 8198

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。

假設乙個二叉搜尋樹具有如下特徵:

輸入:

2/ \

13輸出:true

(1)中序遍歷解法

中序遍歷二叉搜尋樹是遞增序列,每次遍歷取出前乙個值,若當前值不大於前乙個值則不是二叉搜尋樹。

var

isvalidbst

=function

(root)

let node = stack.

pop();

/* pre還未賦值或者小於node.val則符合條件,繼續遍歷 */

if(pre ===

null

|| pre < node.val) pre = node.val;

else

return

false

; p = node.right;

}return

true;}

;

(2)結點上下限判斷解法

自上而下給結點設定上下界限,不符合則返回false

/* ------------遞迴------------ */

varisvalidbst

=function

(root)

return

check

(root, number.

min_safe_integer

, number.

max_safe_integer);

};/* ------------非遞迴------------ */

varisvalidbst

=function

(root)

if(node.right)

}return

true

;}

將乙個按照公升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。

本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

給定有序陣列:[-

10,-3

,0,5

,9],

乙個可能的答案是:[0,

-3,9

,-10,

null,5

],它可以表示下面這個高度平衡二叉搜尋樹:

0/ \ -39

//-10

5

自上而下,取限定區域內的中間值作為當前結點值即可

/* ----------------遞迴---------------- */

varsortedarraytobst

=function

(nums)

return

build(0

, nums.length -1)

;};/* ----------------非遞迴---------------- */

varsortedarraytobst

=function

(nums)

/* 判斷右結點邊界[node.index + 1,node.y] */

if(node.index +

1<= node.y)

}return root;

};

給定乙個二叉樹,原地將它展開為鍊錶。

例如,給定二叉樹

1/ \ 2

5/ \ \34

6將其展開為:1 \

2 \3\

4\5\

6

後序遍歷,遍歷每個結點node時(其左子樹已經處理成為鍊錶)找到左子樹鍊錶尾部結點tmp,將node的右子樹接到tmp右邊,然後將node左子樹放到右邊,左邊置空.

111

/ \ / \ / \

25-->25

-->25

/ \ \ / \ \ \ \34

63-4

6361

:tmp.right=right.right; \

2:node.right = node.left;node.left=

null

;4

var

flatten

=function

(root)

let node = stack[stack.length -1]

;/* 若右子樹存在且未訪問,先遍歷右子樹 */

if(node.right &&

!vis.

has(node.right)

)else

stack.

pop();

}}return root;

};

給定乙個整數 n,生成所有由 1 … n 為節點所組成的二叉搜尋樹。

輸入:

3輸出:[[

1,null,3

,2],

[3,2

,null,1

],[3

,1,null

,null,2

],[2

,1,3

],[1

,null,2

,null,3

]]解釋:以上的輸出對應以下 5 種不同結構的二叉搜尋樹:

13321

\ /

// \ \

321132/

/ \ \

2123

每個數作為根結點的值來連線不同的左子樹和右子樹,將這些組合存入陣列返回作為其他值的左子樹或右子樹進行同樣的操作。

/* ----------------遞迴---------------- */

vargeneratetrees

=function

(n)}

}return res;

}return

gettrees(1

, n);}

;/* ----------------非遞迴---------------- */

vargeneratetrees

=function

(n)let trees =

; trees[0]

=[null];

for(

let i =

1; i <= n; i++)}

}}return trees[n];}

;

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

二叉樹專題

一般的樹 struct node node newnode int v void search node root,int x,int newdata if root data x search root lchild,x,newdata search root rchild,x,newdata 注...