二叉樹的相關概念以及操作

2021-08-17 06:23:26 字數 4859 閱讀 7128

在資料結構與演算法中,樹的這中資料結構是我們必須要學習的,本文來首先來說說樹中的二叉樹

我們都知道樹是一種資料結構,是由n(n>=1)個有限的節點組成的一種具有層次關係的集合。樹的種類有很多,有二叉樹、平衡二叉樹、b樹、b+樹、哈夫曼樹、b-樹、b*樹、紅黑樹、trie樹等,本文我們來說說二叉樹。

二叉樹是有限個節點的集合,這個集合可以是空集,也可以是乙個根節點和兩棵不相交的子二叉樹組成的集合,其中一棵叫左子樹,另外一棵叫右子樹。

所以,二叉樹的定義是個遞迴的定義。其實是上面說了這麼多,二叉樹的理解很簡單,就是一棵樹中的每個節點至多有兩個子節點,而且子節點分左右的。

下面來介紹兩種特殊的二叉樹

1.滿二叉樹

滿二叉樹就是高度為k,且擁有2的k次方減1個節點的二叉樹。其實一棵滿二叉樹每個節點要麼有兩個子樹,要麼都沒有子樹,而且每一層所有節點之間都有兩顆子樹,要麼都沒有子樹。

2.完全二叉樹

完全二叉樹是一棵特殊的二叉樹,它有一些特殊的規則,假設二叉樹的高度為k,則完全二叉樹需要滿足一下兩點

(1)所有葉子結點都出現在k層或者k-1層,而且從1到k-1層必須要達到最大節點數

(2)第k層可以是不滿的,但是第k層的所有節點必須集中在最左邊

其實二叉樹的實現要比普通的數簡單,因為二叉樹的每個節點最多有兩個子節點,其實二叉樹的每個子節點仍是一棵二叉樹,所以我們可以用遞迴的方式來定義二叉樹,首先來看看二叉樹節點的實現**:

package cn.csu;

public class binarytreenode

public void setdata(int data)

public binarytreenode getleftnode()

public void setleftnode(binarytreenode leftnode)

public binarytreenode getrightnoed()

public void setrightnoed(binarytreenode rightnoed)

}

二叉樹的節點有了,一般我們用的是上面的左右鏈的表示方法,接下來要完成完整的二叉樹,就應該對二叉樹進行操作,比如建立、新增元素、清空、遍歷等等。

建立二叉樹一般有兩種情況:初始化乙個根節點或者初始化一棵空二叉樹,**如下:

package cn.csu;

public class binarytree

public binarytreenode getroot()

public void setroot(binarytreenode root)

}

二叉樹的清空也比較簡單,首先我們提供乙個清空某個節點為根的子樹的方法,即遞迴地刪除每個節點,接著提供乙個刪除樹的方法,直接通過第一種方法刪除根節點,我們來看看**:

/**

* 清除某個子樹的所有節點

* @param node

*/public void clear(binarytreenode node)

}/**

* 清空樹

*/public void clear()

我們只需要判斷樹根是否為空就好了**如下:

/**

* 判斷樹是否為空

* @return

*/public boolean isempty()

首先,我們需要一種獲取某個節點為子樹的高度的方法,使用遞迴實現。如果乙個節點為空,那麼這個節點肯定是一棵空樹,高度為0,如果不為空,那麼我們遍歷地比較他的左子樹高度和右子樹高度,高的乙個為這個子樹的的最大高度,然後加上本身的高度就好了。

而獲取二叉樹的高度時只需要傳入根節點就好了,看**

/**

* 獲取二叉樹的高度

* @return

*/public int height()

/*** 獲取某節點為子樹的高度

* @param node

* @return

*/public int height(binarytreenode node)else

/*** 獲取某節點為子樹的節點數

* @param node

* @return

*/public int size(binarytreenode node)else

}

首先同樣需要通過一種方法來獲取某個節點在某個子樹中的父節點,這裡我們使用遞迴實現,接著通過這種方法獲取這個節點在二叉樹的父節點。

其實。以現有的這種二叉樹的形式,我們沒辦法直接獲取乙個乙個節點的父節點,我們通過根節點的依次遍歷來比較獲取

/**

* 查詢node節點在二叉樹中的父節點

* @param node

* @return

*/public binarytreenode getparent(binarytreenode node)

/*** 遞迴查詢node節點在subtree子樹中的父節點

* @param subtree

* @param node

* @return

*/public binarytreenode getparent(binarytreenode subtree,binarytreenode node)

if(subtree.getleftnode() == node || subtree.getrightnode() == node)

binarytreenode parent = null;

//先遞迴在左子樹查詢

if((parent = getparent(subtree.getleftnode(), node)) != null)else

}

這個比較簡單,可以直接通過節點的方法獲取

/**

* 獲取某個節點的左子樹

* @param node

* @return

*/public binarytreenode getlefttree(binarytreenode node)

/*** 獲取某個節點的右子樹

* @param node

* @return

*/public binarytreenode getrighttree(binarytreenode node)

二叉樹的插入操作有兩種情況:插入某節點的左子節點,,插入某節點的右子節點、值得指出的是,當這個節點本身有子節點時,這樣的插入會覆蓋原來這個位置上的節點,另外,雖然插入的是子節點,但其實子節點也可以代表一棵子樹,因為我們但從這個節點來看並不知道這個節點是否有左右子樹在,所以雖然插入的是乙個節點,但有可能也插入了很多節點進來(插入的是一棵子樹)。

/**

* 給某節點插入左子節點

* @param parent

* @param newnode

*/public void insertleft(binarytreenode parent,binarytreenode newnode)

/*** 給某節點插入右子節點

* @param parent

* @param newnode

*/public void insetright(binarytreenode parent,binarytreenode newnode)

這裡我把二叉樹的遍歷單獨列出來,因為在二叉樹的操作中,遍歷是很重要的乙個操作。遍歷方式有三種,下面我們來看看。

首先樹是乙個非線性的結構,如果想要有規律地訪問每乙個節點,則肯定需要根據一定規則去遍歷。二叉樹的遍歷就是按照一定的規律來順序遍歷二叉樹的各個節點,使得每個節點都會被訪問到且僅有一次。這樣的遍歷對學習二叉樹很有用。

下面我分別介紹一下二叉樹遍歷的三種方式,這三種遍歷方式的定義都採用的了遞迴的定義方式

首先為了理解方便,我先給出乙個樹的圖示

若二叉樹為空,則退出,否則進行下面的操作

(1)訪問根節點

(2)前序遍歷左子樹

(3)前序遍歷右子樹

(4)遍歷完畢,退出

**實現如下:

/**

* 前序遍歷

* @param node

*/public void preorder(binarytreenode node)

}

那麼按照前序遍歷的操作,上圖中的二叉樹前序遍歷的結果為a、b、d、h、i、e、j、c、f、g

若二叉樹為空,則退出,否則進行下面操作

(1)中序遍歷左子樹

(2)訪問根節點

(3)中序遍歷右子樹

(4)遍歷完成

**:

/**

* 中序遍歷

* @param node

*/public void inorder(binarytreenode node)

}

那麼圖示的中序遍歷結果為:hidjebfgca

若二叉樹為空,則退出,否則進行下面操作

(1)後序遍歷左子樹

(2)後序遍歷右子樹

(3)訪問根節點

(4)遍歷完畢

**如下:

/**

* 後序遍歷

* @param node

*/public void postorder(binarytreenode node)

}

那麼圖示的二叉樹的後序遍歷結果為    hidjebfgc

二叉樹 二叉樹的相關操作

遞迴實現 建立求樹高 求葉子數 求節點數 統計度為2的結點個數 後序輸出 先序輸出 中序輸出 交換左右子樹 include include include define true 1 define false 0 define ok 1 define error 0 define overflow ...

二叉樹的相關概念

一 概念 二叉樹 二叉樹是結點的乙個有限集合,該集合或者為空,或者是由乙個根節點加上兩顆分別稱為左子樹和右子樹的二叉樹組成。二叉樹的特點 1.每個結點最多有兩顆子樹,即二叉樹不存在度大於2的結點。2.二叉樹的子樹有左右之分,其子樹的次序不能顛倒。滿二叉樹 在一棵二叉樹中,如果所有分支節點都存在左子樹...

二叉樹相關操作

include using namespace std typedef struct btnode btnode btnode newnode int value 非遞迴 btnode nodesearch btnode root,btnode parent,int value 遞迴 btnode ...