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 如上,根據先序遍...