最近學習了二叉樹的一點知識,感覺資料結構真的很難啊,所以學習過程中的筆記還是要記錄一下。
在我們使用的資料結構中,一對一的線性結構是我們經常所使用到的,但是現實中卻有著許多一對多的情況,這也就產生了「樹」這一概念。二叉樹則是「樹」這一概念中的一種特殊情況,其定義為:「是n(n>=0)個結點的有限集合。該集合或者為空集(稱為空二叉樹)。或者由乙個根結點和兩棵互不相交的、分別稱為根結點的左子樹和右子樹的二叉樹組成。」
二叉樹的特點:
(1)每個節點最多有兩個子樹,所以二叉樹的節點的度均小於等於2。
(2)左子樹和右子樹是有順序的,千萬不能對其進行任意顛倒。
…(其特點還有很多,就不一一敘述了)
總的來說,如果說我之前使用的vector和list是一維結構的話,那二叉樹就是二維結構。
node.h
#ifndef _node_
#define _node_
#include
using
namespace std;
class
node
;#endif
// _node_
node.cpp
#include
"node.h"
node::
node
(string data)
:data
(data)
node::
~node()
binarytree.h
#ifndef _binatytree_
#define _binatytree_
#include
"node.h"
#include
#include
using
namespace std;
class
binarytree
;#endif
// !_binatytree_
binarytree.cpp
#include
"binarytree.h"
binarytree::
binarytree()
void binarytree::
add(string data)
while
(!queue.
empty()
)elseif(
!curnode-
>rchild)
else}}
void binarytree::
preorder
(const node* node)
cout << node-
>data <<
" ";
preorder
(node-
>lchild)
;preorder
(node-
>rchild);}
void binarytree::
inorder
(const node * node)
inorder
(node-
>lchild)
; cout << node-
>data <<
" ";
inorder
(node-
>rchild);}
void binarytree::
postorder
(const node * node)
postorder
(node-
>lchild)
;postorder
(node-
>rchild)
; cout << node-
>data <<
" ";
}void binarytree::
destorybinarytree
(node * node)
if(node-
>rchild)
}delete node;
//銷毀節點
在整個過程中,要注意以下幾點:
(1)你怎麼對二叉樹進行遍歷,你就可以使用這種遍歷方式來建立二叉樹。因此二叉樹的建立方式有很多種,我選擇的是層次建立(與其相對應的是層次遍歷,也叫廣度優先遍歷)。
(2)二叉樹的銷毀也可以使用其特定的遍歷方式進行銷毀。
(3)因為層次遍歷的過程很適合佇列這種結構,所以可以使用queue來實現該遍歷過程。
二叉樹的建立與遍歷 二叉樹遍歷模板)
初學二叉樹,感覺之前鍊錶掌握不熟練導致接受有點難,現在做一些總結。本題其實就是根據給出的前序遍歷 包括空子樹 寫出相應的前序 中序和後序遍歷。廢話不多說,先看看題目 description 下面給出了教材中演算法6.4所示的演算法。status createbitree bitree t retur...
二叉樹建立與遍歷
二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱為 左子樹 和 右子樹 二叉樹的每個節點最多只能右兩棵子樹,子樹有左右之分,次序不能顛倒。除了葉結點外每乙個結點都有左右子葉且葉子結點都處在最底層的二叉樹。假設二叉樹的高度為k,除第k層外,其他各層的節點數都達到最大個數。也就是第一層到第k 1層為...
二叉樹建立與遍歷
節點定義 class binnode binnode char data2 data data2 binnode char data2,binnode parent2 data data2 void insertasleft char data void insertasright char dat...