常用資料結構和演算法 二叉樹篇

2021-08-17 03:04:16 字數 2548 閱讀 9650

二叉樹是每個節點最多有兩棵子樹的樹結構。通常子樹被稱作「左子樹」和「右子樹」。二叉樹常被用於實現二叉查詢樹和二叉堆。

在二叉樹的一些應用中,常常要求在樹中查詢具有某種特徵的節點,或者對樹中全部節點進行某種處理,這就涉及到二叉樹的遍歷。二叉樹主要是由3個基本單元組成,根節點、左子樹和右子樹。如果限定先左後右,那麼根據這三個部分遍歷的順序不同,可以分為先序遍歷、中序遍歷和後續遍歷三種。

(1) 先序遍歷 若二叉樹為空,則空操作,否則先訪問根節點,再先序遍歷左子樹,最後先序遍歷右子樹。

(2) 中序遍歷 若二叉樹為空,則空操作,否則先中序遍歷左子樹,再訪問根節點,最後中序遍歷右子樹。

(3) 後序遍歷 若二叉樹為空,則空操作,否則先後序遍歷左子樹訪問根節點,再後序遍歷右子樹,最後訪問根節點。

同樣,我們先構造二叉樹的節點:

class

treenode

>

}

二叉查詢樹的三種遍歷都可以直接用遞迴的方法來實現:

先序遍歷:從根節點開始,圍繞二叉樹的外圍,順時針方向逐個節點查詢.

private

void

preorder(treenoderoot)

system.out.println(root.element+"");

preorder(root.left);

preorder(root.right);

}

中序遍歷:從最左節點開始,順時針的層層查詢.

private

void

inorder(treenoderoot)

inorder(root.left);

system.out.println(root.element+"");

inorder(root.right);

}

後序遍歷:從最左節點開始,逆時針層層查詢.

private

void

postorder(treenoderoot)

postorder(root.left);

postorder(root.right);

system.out.println(root.element+"");

}

二叉查詢樹的簡單查詢與插入實現:

public

class

mysearchtree

//二叉查詢樹的搜尋

public

boolean

search(integer e)else

}return

false;

}//二叉查詢樹的插入

public

boolean

insert(integer e)elseelse

}//插入

if(eelse

}return

true;

}//建立乙個新節點

private treenodecreatenewnode(integer e)

}

二叉樹的刪除節點功能實現:

二叉樹的刪除可以算是二叉樹最為複雜的操作,刪除的時候要考慮到很多種情況:

1.被刪除的節點是葉子節點

2.被刪除的節點只有左孩子節點

3.被刪除的節點只有右孩子節點

4.被刪除的有兩個孩子節點

在二叉樹中想要刪除乙個節點,首先需要找到這個節點,由於二叉樹在插入節點的時候會遵循乙個原則,就是利用節點的值來判斷節點將被插入的位置(或者給節點加乙個key,用key來判斷)。從根節點開始往下走,比當前節點小(或等於)的會被插入到當前節點的左邊,比當前節點大的會被插入到當前節點的右邊。所以,根據根據二叉樹的插入規則來找出即將被刪除的節點。具體實現如下:

public boolean delete(int key)

}else

}if(curr==

null)

}//如果被刪除的節點是葉子節點

if(curr.left==

null

&&curr.right==

null)else

if(isleft)else

}else

if(curr.right==

null)else

if(isleft)else

}else

if(curr.left==

null)else

if(isleft)else

}elseelse

if(isleft)else

}return

true;

}public treenode getsuccessor(treenode delnode)

//迴圈停止,中序後繼節點被找出

if(successor!=delnode.right)

return successor;

}

更多詳細內容可以瀏覽常見資料結構與演算法整理總結.,二叉樹的刪除邏輯原理可以瀏覽二叉樹中刪除乙個節點.

資料結構與演算法篇 二叉樹

節點類定義 class node def init self,val self.val val self.left none self.right none前序 中序 後序遍歷的遞迴 非遞迴 前序 中後續遍歷,改變print的位置即可 def pre root if not root return ...

資料結構和演算法 二叉樹

二叉樹 樹的每個節點最多只能有兩個子節點。樹的效率 查詢節點的時間取決於這個節點所在的層數,每一層最多有2n 1個節點,總共n層共有2n 1個節點,那麼時間複雜度為o logn 底數為2。二叉搜尋樹要求 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結...

資料結構演算法 二叉樹

二叉樹資料結構 bintree.h include templateclass bintree template class treenode type data treenode lchild 左,右子樹 treenode rchild template class bintree void cr...