資料結構 二叉樹

2021-10-02 11:52:22 字數 3350 閱讀 8618

在樹型結構中,乙個結點最多有兩個子結點,並且這兩個結點是區分左右的,次序是不能變的(類似於左右手),這樣的一種特殊的樹型結構稱為二叉樹

二叉樹也是我們主要關注的樹型結構

滿二叉樹和完全二叉樹如下圖所示:

可見,滿二叉樹一定是完全二叉樹;完全二叉樹不一定是滿二叉樹

二叉樹的實現是指利用順序儲存結構或者鏈式儲存結構來儲存二叉樹中的元素,但是元素之間的關係要滿足二叉樹表徵的關係(根結點、左右樹)

先來看順序儲存結構,可以為二叉樹中的每個元素都編上序號,序號和陣列的index對應,這樣就可以儲存在陣列(順序儲存結構)中了,但是怎麼表徵元素之間的關係呢?先來看完全二叉樹,如下圖所示:

對於完成二叉樹,如果根結點從1開始標號的話,元素之間的關係可以用下標表示:結點i左子結點的標號為2i,右子結點的標號為2i+1,父結點的標號是i/2(這裡存在取整)。所以說對於完成二叉樹一般是通過順序儲存結構實現

那麼對於非完全二叉樹呢?當然可以按照完全二叉樹來標號,但是因為會缺少幾個結點,所以造成了儲存空間的浪費,所以對於普通的二叉樹都是採用鏈式儲存結構實現

template class completebinarytree : copyable 

} completebinarytree(const completebinarytree &other);

~completebinarytree()

completebinarytree& operator=(const completebinarytree &other);

int size() const

bool empty() const

private:

int m_size;

t *m_data;

};

利用二叉鍊錶來實現,每個結點由乙個資料域data,兩個指標域left和right分別指向左右子結點

templateclass binarytree : copyable 

};public:

binarytree() :

m_root(nullptr),

m_size(0)

{} binarytree(const binarytree &other);

~binarytree()

if(node->right != nullptr)

delete node;

q.pop();

} }int size() const

bool empty() const

binarytree& operator=(const binarytree &other);

private:

node *m_root;

int m_size;

};

遍歷是二叉樹主要的操作,是其他操作的基礎。二叉樹的遍歷主要分為兩種:

深度優先遍歷是指優先向下找尋子結點。分為:

用一張圖即可搞懂前中後序遍歷的順序,每個結點有三個點表示前序、中序、後序點,順著點和連線線描輪廓,前序遍歷按照描到前序點的順序輸出。中序和後序遍歷則是按照描到中序和後序點的順序輸出

下面的深度優先遍歷的**,由遞迴和迭代兩種方式實現:

/**

* @brief 前序遍歷(迭代)

*/void pre_order()

if(!s.empty())

} std::cout << std::endl;

}/**

* @brief 前序遍歷(遞迴)

*/void pre_order_recursive()

/** * @brief 中序遍歷(迭代)

*/void in_order()

if(!s.empty())

} std::cout << std::endl;

}/**

* @brief 中序遍歷(遞迴)

*/void in_order_recursive()

/** * @brief 後序遍歷(迭代)

*/void post_order()

if(!s.empty())

else

} }std::cout << std::endl;

}/**

* @brief 後序遍歷(遞迴)

*/void post_order_recursive()

private:

void pre_order(node *node)

std::cout << node->data << ' ';

pre_order(node->left);

pre_order(node->right);

}void in_order(node *node)

in_order(node->left);

std::cout << node->data << ' ';

in_order(node->right);

}void post_order(node *node)

post_order(node->left);

post_order(node->right);

std::cout << node->data << ' ';

}

廣度優先遍歷也稱為層序遍歷,優先遍歷同一層中的所有元素

實現的思路是:借助乙個普通的佇列,先將根結點入隊,根結點是很容易拿到。開始乙個迴圈,只要佇列不為空就執行如下操作:

/**

* @brief 層序遍歷

*/void level_order()

if(cur->right != nullptr)

std::cout << cur->data << ' ';

q.pop();

} std::cout << std::endl;

}

完整**見:

線索二叉樹不太常用,這裡簡單介紹下:

引入線索二叉樹的目的就是充分利用二叉樹中空著的指標域,假設一棵二叉樹有n個結點,那麼一共就會有2n個指標域(left、right),但是n個結點連線起來需要n-1條連線,也就是利用了n-1個指標域,這樣就浪費了n+1個指標域,顯然非常浪費空間。

線索二叉樹是利用遍歷(前、中、後、層序遍歷)得到結點間的線性關係,然後利用空著的指標域去記錄這種線性關係,也就是記錄結點的前驅和後繼

如果所用的二叉樹需要經常遍歷或查詢結點時需要某種遍歷序列中的前驅和後繼,那線索二叉樹非常適合

資料結構 二叉樹 反轉二叉樹

include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...

《資料結構》 二叉樹

二叉樹 是 n個結點的有限集,它或為空集,或由乙個根結點及兩棵互不相交的 分別稱為該根的左子樹和右子樹的二叉樹組成。二叉樹不是樹的特殊情況,這是兩種不同的資料結構 它與無序樹和度為 2的有序樹不同。二叉樹的性質 1 二叉樹第 i層上的結點數最多為 2 i 1 2 深度為 k的二叉樹至多有 2 k 1...

資料結構 二叉樹

1.二叉樹 二叉樹是一種特殊結構的樹,每個節點中最多有兩個子節點,如圖1所示 圖1 二叉樹 在圖1中的二叉樹裡,a c有兩個子節點,b d有乙個子節點。對於二叉樹還有圖2中的以下情況 圖2 二叉樹的特殊情況 在博文中還介紹了滿二叉樹和完全二叉樹還有其他的特殊二叉樹。2.二叉樹的實現 有兩種實現方式,...