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

2022-09-11 20:51:21 字數 4595 閱讀 6206

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;}/*

* 判斷給定陣列是否是二分搜尋樹的後續遍歷

* 1.如果陣列為空/長度為零,返回false

* 2.二分搜尋樹的根不斷變化,遞迴呼叫,需要start,end引數指定二分搜尋樹的根節點

* 3.私有函式:判斷從start到end範圍的陣列是否為後續遍歷,判斷方法是找到第乙個大於根節點的節點,

* 再判斷右子樹的節點值是否都大於根節點,如果不是,返回false

* 4.遞迴呼叫確定左右子樹的根節點所在範圍

** */

public boolean verifysquenceofbst(int sequence)

return verifysquenceofbst(sequence, 0, sequence.length - 1);

}private boolean verifysquenceofbst(int sequence, int start, int end)

int i = start;

while (sequence[i] < sequence[end])

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

}return verifysquenceofbst(sequence, start, i - 1) && verifysquenceofbst(sequence, i, end - 1);}/*

* 判斷給定陣列是否是二分搜尋樹的後續遍歷 (沒有用私有函式的寫法)

* 1.如果陣列為空/長度為零,返回false

* 2.二分搜尋樹的根不斷變化,遞迴呼叫,需要start,end引數指定二分搜尋樹的根節點

* 3.私有函式:判斷從start到end範圍的陣列是否為後續遍歷,判斷方法是找到第乙個大於根節點的節點,

* 再判斷右子樹的節點值是否都大於根節點,如果不是,返回false

* 4.遞迴呼叫確定左右子樹的根節點所在範圍

** */

public boolean verifysquenceofbst1(int sequence)

int j = i;

for (; j < len - 1; j++)

boolean left = true, right = true;

if (i > 0) left = verifysquenceofbst1(arrays.copyofrange(sequence, 0, i));

if (i < len - 1) right = verifysquenceofbst1(arrays.copyofrange(sequence, i, len - 1));

return left && right;}/*

*二叉樹的下乙個節點

* 若果x有右孩子,下乙個節點是右孩子最左邊節點

* 如果x沒有右孩子,找到x的parent,若p的左孩子是x,下乙個節點就是p,否則p往上找(p = p.p,x = p)

* */

public class node

public node getsuccessornode(node node)

if (node.right != null) else

return parent;}}

public node getleftmost(node node)

while (node.left != null)

return node;}/*

* 二叉樹層序遍歷

* */

public void levelorder(treenode head)

if(cur.right != null)

if (cur == last) }}

/** 樹的子結構

*判斷root2是否是root1的子樹

*分為兩步:第一步遍歷root1這棵樹,尋找和root2根節點相同的結點

* */

public boolean hassubtree(treenode root1, treenode root2)

if (!res)

if (!res)

}return res;

} = root2.val的情況下,判斷其左右子樹的值是否相同

private boolean tree1hastree2(treenode root1, treenode root2)

if (root2 == null)

if (root1.val != root2.val)

return tree1hastree2(root1.left, root2.left) && tree1hastree2(root1.right, root2.right);}/*

* 二叉樹的映象

** */

public void mirror(treenode root)

if (root.left != null || root.right != null) }/*

* 二叉搜尋樹的中序非遞迴遍歷

* 當前節點不為空,入棧,一直往左竄;當前節點不為空訪問該節點,往右

* */

public void inorder(treenode head) else }}

}/*

* 二叉搜尋樹與雙向鍊錶

* 當前節點不為空,入棧,一直往左竄;當前節點不為空出棧訪問該節點,往右

* */

public treenode convert(treenode root)

stackstack = new stack<>();

treenode pre = null;

treenode cur = root;

boolean flag = true;

while (cur != null || !stack.isempty()) else else

cur = cur.right;}}

return root;

}/*判斷是否為對稱二叉樹

* 對稱的樹的左子樹和右子樹滿足以下條件:都為空,乙個空,都不空

* 1.如果左子樹或右子樹均為空,則該樹對稱;

* 2.如果左子樹或右子樹只有乙個為空,則該樹不對稱;

* 3.如果左子樹和右子樹均不為空,當左子樹的左子樹和右子樹的右子樹映象對稱,

* 且左子樹的右子樹和右子樹的左子樹 映象對稱時,該樹對稱。

* */

/*判斷兩顆樹是否相同

兩棵二叉樹均為空,則相等;

兩棵二叉樹其中一棵為空,另一棵不為空,則不相等;

兩棵二叉樹均不為空,如果根節點的值相等,左子樹相等和右子樹相等,則這兩棵二叉樹相等,否則不相等。

*/boolean issymmetrical(treenode proot)

return iscommon(proot.left, proot.right);

}public boolean iscommon(treenode left, treenode right)

if (left != null && right != null)

return false;}/*

* 二叉搜尋樹第k個節點

* */

int count = 0;

treenode kthnode(treenode proot, int k)

count++;

if (count==k)

treenode right = kthnode(proot.right,k );

if (right!=null)

}return null;}/*

* 二叉搜尋樹第k個節點(方法二)

* */

arraylistlist = new arraylist<>(); // (1)

treenode kthnode1(treenode proot, int k)

return null;

}// 中序遍歷

void addnode(treenode cur)

}}/*

* 序列化和反序列化

* */

string serialize(treenode root)

string s = root.val + "!";

s = s + serialize(root.left);

s = s + serialize(root.right);

return s;

}treenode deserialize(string str)

treenode head = new treenode(integer.valueof(value));

head.left = reconpre(queue);

head.right = reconpre(queue);

return head;

}

劍指offer 二叉樹 二叉樹的映象

操作給定的二叉樹,將其變換為源二叉樹的映象。二叉樹的映象定義 源二叉樹 8 6 10 5 7 9 11 映象二叉樹 8 10 6 11 9 7 51,交換左右子樹 2,遞迴交換左右子樹的左右子節點 package offertest title mirror description author 田...

劍指Offer 二叉樹 對稱的二叉樹

含有兩道題,都從樹的遞迴入手 請完成乙個函式,輸入乙個二叉樹,該函式輸出它的映象。解題思路 映象翻 只需要遍歷二叉樹,每次訪問乙個結點時,交換其左右子樹。實現 definition for a binary tree node.class treenode def init self,x self....

二叉樹 還原二叉樹 二叉搜尋樹

先序遍歷的特點 先遍歷根結點,再遍歷左子樹,最後再遍歷右子樹 中序遍歷的特點 先遍歷左子樹,再遍歷根結點,最後再遍歷右子樹 後序遍歷的特點 先遍歷左子樹,再遍歷右子樹,最後再遍歷根結點 舉例 先序遍歷 a b d f g h i e c 中序遍歷 f d h g i b e a c 如上,根據先序遍...