1、定義
左孩子的值都比自己小,右孩子的值都比自己大
2、搜尋
偽**如下
bst_search(root,x)
輸入:root(指向二叉搜尋樹的根節點)以及x(待搜尋的某數)
輸出:node(指向值為x的節點的指標,如果沒有值為x的節點,則為nil)
begin
if(root == nil || root.key == x)elseelse
}end
3、插入
首先在樹中查詢x,如果已經有了,則操作終止;否則,在某個節點下插入x
bst_insert(root,x)
輸入:root(指向二叉搜尋樹根節點的指標)以及x(待插入的數)
輸出:如果插入失敗則返回nil,如果成功則返回x在樹中的index
begin
if(root == nil)elseelseelse}}
// 能跳出while說明要不就是child為nil了,要不就是node為nil了
if(child != nil)else
return child;
}else
}end
4、刪除
bst_delete(root,x)
輸入:root(指向二叉樹根節點的指標)以及x(待刪除的值)
輸出:如果不存在,則不作為;如果存在,則刪除並改變這棵樹
begin
// 如果樹為空
if(root == nil)elseelse
// 能跳出迴圈說明已經找到最接近x的節點,並且該節點的left為nil
root.key = node.key;
parent.left = node.right;
}}elseelse
// 能跳出迴圈說明已經找到最接近x的節點,並且該節點的right為nil
root.key = node.key;
parent.right = node.left;}}
}elseelse
}// 跳出迴圈要麼是node為nil,要麼是node.key為x
if(node == nil)elseelse
}else if(node.right == nil)else
}elseelse
// 能夠跳出迴圈說明node1.right為nil
node.key = node1.key;// 將左字樹最右孩子的key給node,從而刪除x
parent1.right = node1.left;// 無論node1.left是否為nil}}
}}}end
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...