二叉搜索樹是一類特殊的樹,它或者是一棵空樹,或者滿足若左子樹不為空,則其左子樹所有節(jié)點的值都小于其根節(jié)點的值,若右子樹不為空,則其右子樹所有節(jié)點的值都小于其根節(jié)點的值。
現(xiàn)有一個有序的整數(shù)數(shù)列,生成一棵合理的二叉搜索樹。
生成一棵二叉搜索樹,首先,創(chuàng)建節(jié)點類。
<pre>
class TreeNode {
int value;
TreeNode parent;
TreeNode left;
TreeNode right;
public TreeNode(int value, TreeNode parent, TreeNode left, TreeNode right) {
this.value = value;
this.parent = parent;
this.left = left;
this.right = right;
}
}
</pre>
之后將數(shù)列中每一個值按照規(guī)則分別插到樹中。待插入節(jié)點的值若比當前比較的節(jié)點的值小且當前節(jié)點的左子樹不為空,則將待插入節(jié)點與其左邊的節(jié)點比較,若比當前比較的節(jié)點的值大且當前節(jié)點的右子樹不為空,則將待插入節(jié)點與其右邊的節(jié)點比較;直到節(jié)點左或右子樹為空時將待插入節(jié)點插入。
<pre>
//root為根節(jié)點,newNode為待插入節(jié)點
public TreeNode insert(TreeNode root, TreeNode newNode) {
if(root == null) {
root = newNode;
}else if(newNode.value < root.value) {
root.left = insert(root.left, newNode);
}else if(newNode.value > root.value) {
root.right = insert(root.right, newNode);
}
return root;
}
</pre>
生成了一棵二叉搜索樹,可以將其打印出來。
<pre>
/前序遍歷/
public void preOrder(TreeNode node) {
if(node != null) {
System.out.print(node.value + " ");
preOrder(node.left);
preOrder(node.right);
}
}
/中序遍歷/
public void inOrder(TreeNode node) {
if(node != null) {
inOrder(node.left);
System.out.print(node.value + " ");
inOrder(node.right);
}
}
/后序遍歷/
public void postOrder(TreeNode node) {
if(node != null) {
postOrder(node.left);
postOrder(node.right);
System.out.print(node.value + " ");
}
}
</pre>
但是還有一個條件未滿足,如何生成一棵合理的二叉搜索樹?
我的思路是已知是一個有序的整數(shù)數(shù)列,則將數(shù)列中間的數(shù)作為根節(jié)點,接下來數(shù)列左右兩邊再分別取中間值插入,直到插入所有值。
所以將數(shù)值插入樹之前,對數(shù)列進行重新排序,生成新的數(shù)列。
<pre>
/動態(tài)數(shù)組用于方便存儲新數(shù)列/
ArrayList<Integer> tmp = new ArrayList<Integer>();
</pre>
處理數(shù)列代碼
<pre>
public void handle(int[] value) {
if(value == null) {
return;
}
//獲取中間值并放入新數(shù)列中
int goal = returnCenterValue(value);
tmp.add(value[goal]);
if(value.length == 1) {//若長度為1,已是最后一個值
return;
}else if(value.length == 2) {//若長度為2,將最后一個值也放入新數(shù)列
tmp.add(value[0]);
}else {
//數(shù)列左右兩邊再分別取中間值插入
handle(Arrays.copyOfRange(value, 0, goal));
handle(Arrays.copyOfRange(value, goal+1, value.length));
}
}
/尋找數(shù)列中間值位置,若為偶數(shù)取較大值/
public int returnCenterValue(int[] value) {
if(value.length == 1) {
return 0;
}else if(value.length == 2) {
return 1;
}else {
int tmp = value.length;
return (tmp/2);
}
}
</pre>
以上是個人思路,以后有更好的解決方法我會及時更新。
未經(jīng)同意,不得轉(zhuǎn)載。