二叉樹的構造及常用方法

2021-07-31 17:30:45 字數 2358 閱讀 5237

定義:

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(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 理解從前序中可以直接找到根節點,然後從中序中找到這個根節點並...