鏈式二叉樹 操作總結

2021-08-19 17:50:33 字數 3465 閱讀 9152

二叉樹中反覆使用遞迴思想,掌握尋找子問題的能力就能解決所有二叉樹問題。

非遞迴先序遍歷需要用到資料結構棧,下文提供兩種思路解決。層序遍歷用到佇列,也即廣度遍歷思想。

完整**github:

// 構建二叉樹的結點

pbtnode buybintreenode(btdatatype data);

// 建立二叉樹

void _createbintree(pbtnode* proot, const btdatatype* array, int size, int* index, btdatatype invalid);

void createbintree(pbtnode* proot, const btdatatype* array, int size, btdatatype invalid);

// 拷貝二叉樹

pbtnode copybintree(pbtnode proot);

// 銷毀二叉樹

void destroybintree(pbtnode *proot);

// 前序遍歷遞迴

void preorder(pbtnode proot);

// 前序遍歷非遞迴 一

void preordernor(pbtnode proot);

// 前序遍歷非遞迴 二

void preordernorop(pbtnode proot);

// 中序遍歷遞迴

void inorder(pbtnode proot);

// 後續遍歷遞迴

void postorder(pbtnode proot);

// 層序遍歷

void levelorder(pbtnode proot);

// 二叉樹的映象遞迴

void mirrorbintree(pbtnode proot);

// 二叉樹的映象非遞迴

void mirrorbintreenor(pbtnode proot);

// 求二叉樹中結點的個數

int bintreesize(pbtnode proot);

// 獲取二叉樹中葉子結點的個數

int getleafcount(pbtnode proot);

// 求二叉樹中k層結點的個數

int getklevelnode(pbtnode proot, int k);

// 求二叉樹的高度

int height(pbtnode proot);

bintree.c

#include 

#include

#include

#include "bintree.h"

#include "queue.h"

#include "stack.h"

// 構建二叉樹的結點

pbtnode buybintreenode(btdatatype data)

pnew->_data = data;

pnew->_pleft = pnew->_pright = null;

return pnew;

}// 建立二叉樹

void _createbintree(pbtnode* proot, const btdatatype* array, int size, int* index, btdatatype invalid)

}void createbintree(pbtnode* proot, const btdatatype* array, int size, btdatatype invalid)

// 拷貝二叉樹

pbtnode copybintree(pbtnode proot)

return pnew;

}// 銷毀二叉樹

void destroybintree(pbtnode *proot)

}// 前序遍歷遞迴

void preorder(pbtnode proot)

}// 前序遍歷非遞迴一

void preordernor(pbtnode proot)

}// 前序遍歷非遞迴二

void preordernorop(pbtnode proot)

pcur = pcur->_pleft;}}

}// 中序遍歷遞迴

void inorder(pbtnode proot)

}// 後續遍歷遞迴

void postorder(pbtnode proot)

}// 層序遍歷

void levelorder(pbtnode proot)

}void swap(pbtnode *left, pbtnode *right)

// 二叉樹的映象遞迴

void mirrorbintree(pbtnode proot)

}// 二叉樹的映象非遞迴

void mirrorbintreenor(pbtnode proot)

}// 求二叉樹中結點的個數

int bintreesize(pbtnode proot)

return bintreesize(proot->_pleft) + bintreesize(proot->_pright) + 1;

}// 獲取二叉樹中葉子結點的個數

int getleafcount(pbtnode proot)

if (null == proot->_pleft && null == proot->_pright)

return getleafcount(proot->_pleft) + getleafcount(proot->_pright);

}// 求二叉樹中k層結點的個數

int getklevelnode(pbtnode proot, int k)

if (k == 1)

return getklevelnode(proot->_pleft, k - 1) + getklevelnode(proot->_pright, k - 1);

}// 求二叉樹的高度

int height(pbtnode proot)

int left = height(proot->_pleft);

int right = height(proot->_pright);

return left > right ? left + 1 : right + 1;

}

二叉樹鏈式儲存操作

前言 二叉樹的儲存結構 1.二叉樹的順序儲存結構 利用性質5,對於完全二叉樹可以利用一維陣列儲存,如果不是完全二叉樹,則可以補空節點,使成為完全二叉樹在進行儲存,但是對於非完全二叉樹,可能要浪費很多的空間。2.二叉樹的鏈式儲存結構 二叉樹的鏈式儲存結構就是用指標建立二叉樹中節點之間的關係,二叉樹最常...

二叉樹操作總結

對於二叉樹,有前序 中序 後序三種遍歷方法,由於樹的定義本身就是遞迴定義的,故採用遞迴方法實現三種遍歷簡潔易懂。若採用非遞迴訪問,則需要使用棧來模擬遞迴的實現。三種遍歷的非遞迴演算法中,前序和後序較容易,而後序相對較難。前序遍歷 遞迴非遞迴 樹的遍歷 中序遍歷 遞迴非遞迴 後序遍歷 遞迴非遞迴 層次...

二叉樹基礎操作總結

1.定義資料結構 二叉樹 typedef char btdatatype typedef struct binarytreenode btnode 2.各個函式介面宣告 建立乙個二叉樹結點 btnode buybtnode btdatatype x 建立一顆二叉樹 btnode binarytree...