二叉排序樹

2021-10-09 01:43:01 字數 3081 閱讀 5237

規則:

左子節點值 < 父節點值

右子節點值》=父節點值

如果中序遍歷二叉排序樹,則會公升序排列

節點的新增和遍歷

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 ...