棧、佇列、鍊錶都有他們各自的好處,同樣的也有弊端的存在。
如果我想要乙個有序的陣列和鍊錶這個當然很好實現。現在我要在這幾個資料結構中查詢乙個值。先說陣列,因為是有序的通過二分查詢很快的就可以找到。查詢的效率還是很高的,但如果要是插入呢,為了保證有序,我要先找到插入位置,然後再將比插入數字大的數字依次向後移動;這時的第一反應就是鍊錶!他打插入速度很快,只要改變指標的指向就可以了。但是鍊錶大查詢要從頭開始找啊。只有知道了前乙個元素的位址才能知道下乙個位址。所以鍊錶查詢起來又費勁了。這時候就有人引進了樹。
樹也分很多種,只說特殊的二叉樹中的二叉搜尋樹。
二叉搜尋樹定義:乙個節點的左子節點的關鍵自值小於這個節點,右子節點的關鍵字值大於或等於這個父節點。
二叉搜尋樹插入的時候可以直接改變左樹右樹的指標指向,查詢的時候可以根據排序二叉樹的特點。
這就是乙個二叉搜尋樹
[img]
現在開始用**來描述這棵樹。先看節點類
**不多,描述了乙個節點的內容。關於二叉搜尋樹的描述主要從查詢節點、新增節點、遍歷、最大值、最小值、刪除節點來描述。這裡不包括存在相等節點的情況。
[b]查詢節點[/b]:這個比較簡單,根據二叉樹的定義查詢就可以了。看圖寫**最方便,
[img]
再看**
public treenode search(int key) else
if (node == null)
}return node;
}
[b]新增節點[/b],新增節點的過程是現搜尋再新增。先看圖
[img]
再看**
public void insert(int key) else
} else }}
}}
[b]遍歷樹[/b]:遍歷分為中序遍歷(最常用,也最有用),前序遍歷,後續遍歷。
這裡就發乙個中序遍歷的圖,理解了這個前序和後續都很好理解。
[img]
再看**
public void display(treenode node)
}
[b]最大值、最小值[/b]:這個就不用說了,最大值一直往右走,最小值一直往左走。
直接上**:
public int max()
return parent.keyvalue;
}public int min()
return parent.keyvalue;
}
關於刪除節點單獨發一篇,因為實在太麻煩了。。。
二叉搜尋樹c 二叉搜尋樹的遍歷
可以總結出三條性質 1 非空左子樹的所有鍵值小於根節點的鍵值。2 非空右子樹的所有鍵值大於根節點的鍵值。3 左右子樹都是二叉搜尋樹。他的遍歷有三種形式 先序遍歷 中序遍歷 後序遍歷。1 先序遍歷 根節點 左子樹 右子樹 首先訪問根節點,然後遍歷左子樹,最後右子樹。並且自遍歷左右子樹時,仍然先訪問根節...
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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...
二叉搜尋樹的遍歷
推出乙個新系列,看圖輕鬆理解資料結構和演算法 主要使用來描述常見的資料結構和演算法,輕鬆閱讀並理解掌握。本系列包括各種堆 各種佇列 各種列表 各種樹 各種圖 各種排序等等幾十篇的樣子。二叉搜尋樹 binary search tree,簡寫bst 又稱為二叉排序樹,屬於樹的一種,通過二叉樹將資料組織起...