二叉樹中反覆使用遞迴思想,掌握尋找子問題的能力就能解決所有二叉樹問題。
非遞迴先序遍歷需要用到資料結構棧,下文提供兩種思路解決。層序遍歷用到佇列,也即廣度遍歷思想。
完整**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...