定義:
二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉堆。
特點:二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2^(i-1)個結點;深度為k的二叉樹至多有2^k-1個結點;對任何一棵二叉樹,如果其終端結點(即葉子節點)數為n0,度為2的結點數為n2,則n0=n2+1。
滿二叉樹:乙個二叉樹,如果每乙個層的結點數都達到最大值,即節點總數為2^k-1
完全二叉樹:若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊
template//建立節點
struct binarytreenode
t _value;
binarytreenode* _pleft;
binarytreenode* _pright;};
template// 建立二叉樹、二叉樹的基本函式
class binarytree
binarytree(const t array,size_t size,const t& invalid)
binarytree(const binarytree& bt) //拷貝建構函式
binarytree& operator=(const binarytree& bt) //賦值運算子過載
return *this;
}~binarytree() //析構函式
void _createbinarytree(node* &proot,const t array,size_t size,size_t & index,const t& invalid) //構造二叉樹
}node* _copybinarytree(node* proot) //拷貝二叉樹
return pnewnode; //返回根節點
}void _destroybinarytree(node*& proot) //銷毀二叉樹}
//二叉樹的基本構造就完成了
——二叉樹的常見操作
//前序遍歷
public:
void perorder()
private:
void _perorder(node* proot) }
//中序遍歷
void _inorder(node* proot)
}//後序遍歷
void _postorder(node* proot)}
—三種遍歷的基本方法都相同,只訪問的順序不一樣
— ——這三種遍歷方式均為遞迴遍歷
//找特定值的節點
public:
node* find(const t& value) //包裝find方法
private:
node* _find(node* proot,const t& value)
//找某個節點的父節點
public:
node* find(const t& value)
private:
node* _find(node* proot,const t& value)
//樹的高度
size_t _height(node* proot)// null -> 0 乙個節點->1 多個節點->左、右子樹
//葉子節點的個數
size_t _getleefcount(node* proot)
//第k層葉子節點的個數
size_t _getklevelcount(node* proot,size_t k)
//二叉樹的映象樹-------左右子樹顛倒
void _binarymirror(node* proot)}
——非遞迴的三種遍歷方式
//前序遍歷
void perorder_nor()
cout<}
//中序遍歷
void inorder_nor()
pcur=s.top();
cout<_value<<" ";
s.pop();
pcur=pcur->_pright;
}cout<}
//後序遍歷
void postorder_nor()
node* ptop=s.top();
if(null == ptop->_pright || ptop->_pright==prev)
else
pcur=ptop->_pright;}}
ok,就這樣,完成了
void _inorder(node* proot)}
二叉樹的構造方法
做leetcode上面的題目時,遇到二叉樹的問題,想要用乙個二叉樹進行驗證,每次構造二叉樹都很麻煩,特此寫乙個建構函式。1.用陣列構造二叉樹 void treenodeconstructor treenode root,int data,int n,int index int e data inde...
二叉樹構造
題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。public int findvalptr vectorarr,int val return i 查詢子樹的根節點 publi...
構造二叉樹
題目 根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7 理解從前序中可以直接找到根節點,然後從中序中找到這個根節點並...