二叉樹儲存及遍歷

2021-07-26 23:11:31 字數 1973 閱讀 7171

二叉樹儲存及遍歷

1、樹的儲存:

注意:樹的深度是從根節點開始(其深度為1)自頂向下逐層累加的,而高度是從葉節點開始(其高度為1)自底向上逐層累加的。雖然樹的深度和高度一樣,但是具體到樹的某個節點,其深度和高度是不一樣的。我的理解是:非根非葉結點的深度是從根節點數到它的,高度是從葉節點數到它的。

二叉樹的儲存:1、陣列儲存(此方法適合完全二叉樹的儲存)

2、鍊錶儲存(可分為二叉鍊錶,三叉鍊錶)結構如下:

2、 使用二叉鍊錶實現二叉樹

測試用例:

int a[10] = ;//其中用'表示空'

按前序遍歷的演算法重建出二叉樹為:(先建立根節點,再建立左子樹,後建立右子樹)

**實現:

binarytree* _createbinarytree(const t *a,size_t size, size_t&index)

else

return

node;

}

3、二叉樹的遍歷

以上圖的二叉樹為例:

1-a、先序遍歷(由於二叉樹的結構具有遞迴的特性可以採用遞迴的方式遍歷)

void _prevorder(binarytreenode*root)

else

return

;

}

1-b、二叉樹的非遞迴先序遍歷

思想:1、可以採用棧先進先出的原則:先使根節點入棧,棧不為空列印棧頂元素,彈出棧頂元素,

2、在使棧頂元素的不為空右子樹入棧,再使棧頂元素的不為空左子樹入棧

3、 再按1、2進行判斷直至棧為空退出

void prevorder_nonr(binarytreenode*_root)

stack

*>s1;

s1.push(_root);

while (!s1.empty())

if (top->_left)

}cout

<

}

2-a、二叉樹的中序遍歷(遞迴)

void _inorder(binarytreenode*root)

else

}

2-b、二叉樹的中序遍歷非遞迴

思想:中序遍歷是先遍歷左子樹,再遍歷根節點,後遍歷右子樹

1、使cur指向根節點,使cur->_left入棧直至cur為空(定義cur是為了指向當前遍歷的節點)

2、若棧不為空,列印棧頂元素,使cur指向棧頂元素的右子樹(當前的棧頂元素也就是某乙個樹的根節點,但其右子樹還未遍歷所以使cur指向其右子樹)

3-a、若棧不為空,前一步棧頂元素的右子樹為空,直接列印當前棧頂元素也就是前一步棧頂元素的根節點

3-b、若棧不為空,前一步棧頂元素的右子樹不為空,使cur指向的右子樹入棧

4、在按照2,3的步驟迴圈,直至cur和棧為空時結束

//

非遞迴中序

void inorder_nonr(binarytreenode*root)

if (!s1.empty())

}cout

<

}

3-a二叉樹的後續遍歷(遞迴)

void _postorder(binarytreenode*root)

else

}

二叉樹 儲存 遍歷

樹的每個節點最多有兩個孩子節點 乙個節點編號i,它的雙親i 2,左孩子2i,右孩子2i 1 先序遍歷 根左右 中序遍歷 左根右 後續遍歷 左右根 二叉樹節點是個靜態類 private static class treenode 構建二叉樹 傳入乙個集合序列,linkedlist適合插入資料,頻繁刪除...

二叉樹的遍歷 二叉樹遍歷與儲存

在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...

二叉樹及二叉樹的遍歷

二叉樹的定義 樹的度為2的樹。二叉樹的遞迴定義 二叉樹或者是一棵空樹,或者是一棵由乙個根結點和兩棵互不相交的左子樹和右子樹所組成的非空樹,而左右子樹又都是一棵二叉樹。1.第i層上至多有2的i 1次方個結點。2.深度為h的二叉樹至多有2的h次方減1個結點。3.每一層都滿的二叉樹稱為滿二叉樹,只在最後一...