#include
using
namespace
std;
#include
#include
#include
template
struct binarytreenode
t _data;
binarytreenode* _pleft; // 左孩子
binarytreenode* _pright; // 右孩子
};template
class binarytree
//構造二叉樹
binarytree(const t array, size_t size, const t& invalid)
//拷貝二叉樹
binarytree(const binarytree& t)
//二叉樹的賦值函式
binarytree& operator=(const binarytree& t)
}// 遞迴前序遍歷:訪問根結點-->左子樹-->右子樹
void preorder()
cout
根結點-->右子樹
void inorder()
pcur = s.top(); //取棧頂
cout
<_data<<" "; //訪問
s.pop(); //出棧
pcur = pcur->_pright;
}cout
右子樹-->根節點
void postorder()
pcur = s.top(); //取棧頂
if(pcur->_pright == null || prev == pcur->_pright)
else
}cout
void levelorder()
//找到結點的左孩子
node* getleftchild(node* pcur)
//找到結點的右孩子
node* getrightchild(node* pcur)
//在二叉樹中查詢某個節點
node* find(const t& value)
//二叉樹的高度
size_t height()
//葉子結點的個數
size_t getleefnode()
//第k層有幾個節點
size_t getklevelnode(size_t k)
// 求二叉樹的映象:非遞迴
void getbinarymirror_nor()
else } }
// 求二叉樹的映象:遞迴版本
void getbinarymirror()
// 利用層序遍歷來處理--> 關鍵:找第乙個度不為2的結點-->後續結點
// 如果有孩子則不是完全二叉樹
// 否則:是
bool iscompletebinarytree()
else
else
if(pcur->_pright!= null)
else
if(pcur->_pleft != null)
else}}
return
false;
}// 求二叉樹中兩個節點的最近公共祖先節點
node* getlastcommonparent(node* node1, node* node2)
// 由前序遍歷序列和中序遍歷序列重建二叉樹
node* rebuildbinarytree(char* preorder, char* inorder, int length)
}// 重建左子樹
int nodenumleft = rootpositioninorder;
char* ppreorderleft = preorder + 1;
char* pinorderleft = inorder + nodenumleft;
_proot->_pleft = rebuildbinarytree(ppreorderleft, pinorderleft, nodenumleft);
// 重建右子樹
int nodenumright = length - nodenumleft - 1;
char* ppreorderright = preorder + 1 + nodenumleft;
char* pinorderright = inorder + nodenumleft + 1;
_proot->_pright = rebuildbinarytree(ppreorderright, pinorderright, nodenumright);
return _proot;
}private:
void _createtree(node*& proot, const t array,
size_t size, size_t& index, const t& invalid)
}node* _copybinarytree(node* proot)
return null;
}void _destroytree(node* &proot)
}void _preorder(node* proot)
}void _inorder(node* proot)
}void _postorder(node* proot)
}void _levelorder(node* proot)
}node* _getparent(node* proot, node* x)
node* _find(node* proot, const t& value)
size_t _height(node* proot)
size_t _getleefnode(node* proot)
size_t _getklevelnode(node* proot, size_t k)
void _getbinarymirror(node* proot)
bool getnodepath(node* proot, node* pnode, list
& path)
if(proot == null)
return
false;
path.push_back(proot);
bool found = false;
found = getnodepath(proot->_pleft, pnode, path); //在左子樹中尋找
if(!found) //在左子樹中沒有找到,在右子樹中尋找
found = getnodepath(proot->_pright, pnode, path);
if(!found) //沒有找到該節點
path.pop_back();
return found;
}node* _getlastcommonparent(node* proot, node* node1, node* node2)
return plast;
}private:
binarytreenode* _proot;
};void funtest()
; char str2 = ;
tree.rebuildbinarytree(str1, str2, 7);
}int main()
二叉樹 二叉樹的相關操作
遞迴實現 建立求樹高 求葉子數 求節點數 統計度為2的結點個數 後序輸出 先序輸出 中序輸出 交換左右子樹 include include include define true 1 define false 0 define ok 1 define error 0 define overflow ...
二叉樹操作
最近在溫習資料結構,把書中的 寫了一遍,下面是二叉樹的基本操作,包括 1 四種遍歷二叉樹的方法 前序遍歷 中序遍歷 後序遍歷和層序遍歷,其中又包括了遞迴的和非遞迴 2 兩種建立二叉樹的方法 根據二叉樹的前序和中序序列建立二叉樹和根據二叉樹的中序後序序列建立二叉樹。1.二叉樹的儲存結構 headfil...
二叉樹操作
本文章主要包括了以下內容 建立二叉樹類。二叉樹的儲存結構使用鍊錶。供操作 前序遍歷 中序遍歷 後序遍歷 層次遍歷 計算二叉樹結點數目 計算二叉樹高度。接收鍵盤錄入的二叉樹前序序列和中序序列 各元素各不相同 輸出該二叉樹的後序序列。下面是c include include include using ...