規則:
左子節點值 < 父節點值
右子節點值》=父節點值
如果中序遍歷二叉排序樹,則會公升序排列
節點的新增和遍歷
public
class
binarysorttree
else
}public
void
infview()
else
}public
static
void
main
(string[
] args)
; binarysorttree tree =
newbinarysorttree()
;for
(int i =
0; i < arr.length; i++
) tree.
infview()
; tree.
add(null);}
}class
node
// 新增節點
// 思路: 如果被新增node小於當前節點,則新增到當前節點的左邊,如果當前節點左邊不為空,則遞迴探索該節點的左邊節點
// 如果被新增的node大於等於當前節點,則新增到當前節點的右邊,如果當前節點右邊不為空,則遞迴探索該節點的右邊節點
public
void
add(node node)
// this.val 相當於根節點的值
if(node.val <
this
.val)
else
}else
else}}
// 前序遍歷
public
void
infview
(node root)
infview
(root.left)
; system.out.
println
(root.val)
;infview
(root.right);}
}
思路:
首先分成三種情況:
刪除葉子節點
刪除只有一顆子樹的節點
刪除有兩顆子樹的節點
對於1:
1). 找到要刪除的節點target
2). 找到目標節點的父節點
3).判斷target是父節點的左節點還是右節點
4).如果是左節點: parent.left = null; 如果是右節點: parent.right = null
對於2:
1). 2). 3)同上
4). 判斷target的子節點是左節點還是右節點
5). 如果target有左節點
5.1). target為parent的左子節點, parent.left = target.left
5.2). target為parent的右子節點, parent.right = target.left
6). 如果target有右節點
6.1). target為parent的左子節點, parent.left = target.right
6.2). target為parent的右子節點, parent.right = target.right
對於3:
1). 2)同上
3). 從target的右子樹中找到最小節點,記為temp(或者左子樹中的最大節點)
4). 刪除最小節點, target.val = temp.val
node類中
public
void
delete
(int val)
else
else
}elseif(
(target.left!=null&&target.right==null)
||(target.left==null&&target.right!=null)
)else
}else
else}}
else
else}}
else
else
if(target.left!=null)
else
}else
else}}
}}// 輔助函式: 找到要刪除的節點
public node search
(int val)if(
this
.val > val)
else
}else
else}}
// 輔助方法2: 找到target的父節點
public node searchparent
(int val)if(
this
.val > val)
else
}else
else}}
// 輔助方法3: 判斷target是parent的左子樹
public
boolean
isleft
(node parent)
else
}// 輔助方法4: 判斷target是parent的右子樹
public
boolean
isright
(node parent)
else
}// 輔助方法5: 找到target右子樹中的最小值
public
intminval()
return
this
.left.
minval()
;}// 輔助方法6: 找到target左子樹中的最大值
public
intmaxval()
return
this
.right.
minval()
;}
選擇二叉樹中
// 刪除節點
public
void
delete
(int val)
else
}
上述寫的太複雜,有待優化 二叉排序樹
在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...
二叉排序樹
name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...
二叉排序樹
include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...