二叉樹的基本操作及部分面試題

2021-07-31 17:32:52 字數 4358 閱讀 4269

1.構造二叉樹

#include

#include

#include

#include

using

namespace

std;

template

struct binarytreenode

};template

class binarytree

binarytree(const t array,size_t size,const t& invalid)//建構函式

binarytree(const binarytree& bt)//拷貝建構函式

~binarytree()

binarytree& operator=(const binarytree& bt)

return *this;

}private:

void _createbinarytree(node* &proot,const t array,size_t size,size_t& index,const t& invalid)

}node* _copybinarytree(node* proot)//拷貝

return pnewroot;

}void _destroybinarytree(node* &proot)

}private:

node* _proot;

};

2.二叉樹的遍歷—遞迴形式

public:

void preorder()//前序遍歷(遞迴)--介面

cout

void _preorder(node* proot)//前序遍歷(遞迴)

}void _inorder(node* proot)//中序遍歷(遞迴)

}void _postorder(node* proot)//後序遍歷(遞迴)

}

3.二叉樹的遍歷—-非遞迴形式

public:

void _preorder_nor()//前序遍歷(非遞迴)---方法一

cout

}cout

pcur=s.top();

cout

<_value<<" ";

s.pop();

while(null==pcur->_pright && !s.empty())//右子樹不存在時

pcur=pcur->_pright;

}cout

node* ptop=s.top();

if(null==ptop->_pright||prev==ptop->_pright)//右子樹存在時,可能會被訪問兩次,造成死迴圈,所以要判斷是否已經訪問過

else

pcur=ptop->_pright;

}cout

<4.找二叉樹中是否有某個節點

public:

node* find(const t& value)//找二叉樹中某個結點

private:

node* _find(node* proot,const t& value)//根據值尋找二叉樹中的相應結點

4.獲取雙親節點

public:

node*

parent(node* pcur)//尋找雙親結點

private:

node* _parent(node* proot,node* pcur)//獲取雙親,proot為根節點

5.獲取左孩子節點

public:

node* leftchild(node* pcur)//尋找左孩子結點

private:

node* _leftchild(node* proot,node* pcur)

6.獲取右孩子節點

public:

node* rightchild(node* pcur)//尋找右孩子結點

private:

node* _rightchild(node* proot,node* pcur)

7.計算二叉樹的深度

public:

size_t height()//計算二叉樹的深度

private:

size_t _height(node* proot)//計算二叉樹的深度

else

return

0; }

8.計算二叉樹的葉子節點個數

public:

size_t getleefcount()//計算葉子結點個數

privte:

size_t _getleefcount(node* proot)//計算葉子結點個數

9.計算二叉樹第k層的節點個數

public:

size_t getklevelcount(size_t k)//計算二叉樹第k層結點數

private:

size_t _getklevelcount(node* proot,size_t k)//計算二叉樹的第k層節點數

10.求二叉樹的映象樹—-遞迴形式

public:

void binarymirror()//求映象樹(遞迴)

private:

void _binarymirror(node* proot)//映象樹(遞迴)

}

11.求二叉樹的映象樹—-非遞迴形式

public:

void binarymirror_nor()//求映象樹(非遞迴)

}

12.判斷是否為完全二叉樹

public:

bool iscompletebinarytree()//判斷是否為完全二叉樹?

if(pcur->_pleft && pcur->_pright)

else

if(pcur->_pleft)

else

if(pcur->_pright)

return

false;

else

flag=true;

q.pop();

}return

true;

}

13.根據前序遍歷和中序遍歷的結果重建二叉樹

public:

node* rebuild_prein(t pre,int start_pre,int end_pre,t in,int start_in,int end_in)//根據前序遍歷和中序遍歷的結果重建二叉樹

if(index>end_in)

return null;

if (index > start_in)

//有右子樹,遞迴呼叫構建右子樹

if (index

< end_in)

return pcur;

}

14.求兩個節點最近的公共祖先

public:

void commonancestor(node* node1,node* node2)

if (_getpath(proot->_pleft,pcur,s))//在左子樹中找路徑

if (_getpath(proot->_pright,pcur,s))//在右子樹中找路徑

s.pop();

return

false;

}node* _commonancestor(node*& proot,node* n1,node* n2)//求兩個節點的最近公共祖先(時間複雜度:o(n))

stack

s1;stack

s2;//用棧s1和s2分別儲存節點n1和節點n2的路徑

_getpath(proot,n1,s1);

_getpath(proot,n2,s2);

//將多餘的路徑刪除

while (s1.size() > s2.size())

while(s1.size() < s2.size())

//找s1與s2中不同的節點

while(s1.top() != s2.top())

return s1.top();

}

15.測試**:

void test()

int main()

二叉樹基本操作及面試題

include include include includeusing namespace std templatestruct binarytreenode 給出二叉樹節點的結構體 t value 值 binarytreenode pleft 左孩子 binarytreenode pright ...

二叉樹的基本操作與面試題

面試題 拷貝二叉樹 前序遍歷非遞迴 二叉樹的映象遞迴 二叉樹的映象非遞迴 求二叉樹中結點的個數 獲取二叉樹中葉子結點的個數 求二叉樹中k層結點的個數 求二叉樹的高度 其中用到的佇列 棧的基本操作 二叉樹的基本操作 queue.h pragma once typedef char btdatatype...

資料結構 二叉樹基本操作 二叉樹面試題

二叉樹的基本概念就不多說了 如下 binarytree.c pragma once include include include include typedef char btdatatype typedef struct binarytreenode btnode a是乙個前序遍歷的陣列 二叉樹...