二叉搜尋樹,對於任何結點x,它的左子樹結點關鍵字不大於x.key,右子樹結點關鍵字不小於x.key。
二叉樹刪除結點的4種情況
(a)當刪除的結點只有右孩子的時候:
if (deletenode.left == null)
this.transplant(deletenode, deletenode.right);
(b)當刪除的結點只有左孩子的時候:
else if (deletenode.right == null)
this.transplant(deletenode, deletenode.left);
(c)當刪除的結點有左孩子和右孩子的時候且它的後繼父節點是它:
nodemin = this.findmin(deletenode.right);
min.parent == deletenode// 刪除結點和它的後繼是父子關係,滿足這個條件
this.transplant(deletenode, min);
min.left = deletenode.left;
deletenode.left.parent = min.left;
(d)當刪除的結點有左孩子和右孩子的時候且它的後繼同它不是父子關係:
nodemin = this.findmin(deletenode.right); //min就是y
min.parent != deletenode //y的父親不是z
this.transplant(deletenode, min); //讓刪除結點x的父親成為y的父親
min.left = deletenode.left;// x的左孩子成為y的左孩子
求按照中序遍歷的結點後繼:
一種情況是x的右子樹非空,那麼x的後繼就是右子樹的最左結點,還有一種情況就是13和15的關係。
/*
* 按照中序遍歷返回結點後繼
* */
public nodesuccessor(t item)
return par;
} }
二叉搜尋樹的完整**:
public class bstree>
public node(t val, nodepar, nodeleft, noderight)
public t item;
public nodeparent;
public nodeleft;
public noderight;
} /*
* 按照中序遍歷返回結點後繼
* */
public nodesuccessor(t item)
return par;
} }/* * 值為item的結點插入到二叉樹中
*/public void insert(t item)
newnode.parent = par; // 插入節點的parent儲存父節點的指標
if (par == null) //空樹的情況
root = newnode;
else if (newnode.item.compareto(par.item) < 0)
par.left = newnode;
else
par.right = newnode;
} /*
* 交換子樹dest和src
*/private void transplant(nodedest, nodesrc)
/* * 刪除二叉樹中的第一次出現的結點
*/public void delete(t item)
this.transplant(deletenode, min);
min.left = deletenode.left;
deletenode.left.parent = min;
} }public nodesearch(t item)
return pointer;
} else
return root;
} public nodefindmin(noderoot) else
return null;
} /*
* 中序遍歷
*/public void inorderwithoutrecur() else
} }/* * 前序遍歷
*/public void preorderwithoutrecur()
if (pointer.left != null) else
} }/* * 層次遍歷,廣度優先
*/public void levelorder()
} /*
* 後序遍歷
*/private enum tags // 定義列舉型別標誌位
private class stackelement // 棧元素定義
public void postorderwithoutrecur()
element = stack.top();
stack.pop();
pointer = element.pointer;
if (element.tag == tags.left) else // 訪問乙個結點時,需要知道是否已經訪問過它的右結點
}} public static void main(string args)
system.out.println("中序遍歷:");
system.out.println("按照中序遍歷,6的後繼:"+bst.successor(6).item);
bst.inorderwithoutrecur();
system.out.println("\n先序遍歷:");
bst.preorderwithoutrecur();
system.out.println("\n層序遍歷");
bst.levelorder();
bst.delete(1);
system.out.println("\n後序遍歷:");
bst.postorderwithoutrecur();
}}
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 ...
樹 二叉樹 二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...