1.先序/中序/后序遍历二叉树(递归非递归实现),层序遍历二叉树遍历
2.求二叉树的高度
size_t Height()//获取该树的高度
{
return _Height(_pRoot);
}
size_t _Height(Node* pRoot)//获取数树的深度,根节点为1
{
if(pRoot==NULL)
return 0;
if(pRoot->_pLeft==NULL && pRoot->_pRight==NULL)
return 1;
size_t LeftHeight = _Height(pRoot->_pLeft);
size_t RightHeight = _Height(pRoot->_pRight);
if(LeftHeight > RightHeight)
return LeftHeight+1;
else
return RightHeight+1;
}
3.叶子节点的个数
size_t GetLeefNode()//获取叶子节点的个数(左子树叶子节点加上右子树的叶子节点)
{
return _GetLeefNode(_pRoot);
}
size_t _GetLeefNode(Node* pRoot)//获取叶子节点的个数---递归左子树叶子节点加上右子树的叶子节点数
{
if(pRoot==NULL)
return 0;
if(pRoot->_pLeft==NULL || pRoot->_pRight==NULL)
return 1;
size_t pLeftLeefNode = _GetLeefNode(pRoot->_pLeft);
size_t pRightLeefNode = _GetLeefNode(pRoot->_pRight);
return pLeftLeefNode+pRightLeefNode;
}
4.求第k层节点的个数
size_t GetKLevelNode(const size_t& k)//获取第K层节点总数
{
return _GetKLevelNode(_pRoot,k);
}
size_t _GetKLevelNode(Node* pRoot,size_t k)//获取第k层节点个数--递归K-1层节点数
{
if(pRoot==NULL || k<=0 || k>_Height(pRoot))
return 0;
if(k == 1)
return 1;
size_t LeftKLevelNode = _GetKLevelNode(pRoot->_pLeft,k-1);
size_t RightKLevelNode = _GetKLevelNode(pRoot->_pRight,k-1);
return LeftKLevelNode+RightKLevelNode;
}
2、3、4这三道常见面试题都是采用根据先序遍历的方法,来对节点进行递归操作
5.树中两个节点的最低公共祖先
思考分析:
该题根据题目给出的条件不同,将会有不同的简便算法;
1>.该树是二叉收索树。
二叉收索树的左孩子小于根节点,根节点小于右孩子,所 以我们可以直接根据节点的值,对左右子树进行判断,从而得到结果
2>.该树是普通树,但有pParent指针。此时我们可以根据pPaent指针将该问题转化为求相交两个链表第一个相交的节点
3>.该树是普通的树,不含pParent指针
我们今天就介绍普通的树,有三种得到最低公共祖先的方法
- 从根节点开始遍历节点,判断所求节点是否在其左右子树,若在,继续向下遍历,否则,根节点就是它的双亲节点
缺点:重复遍历节点,时间开销大
//树中两个节点的最低公共祖先(实现2---利用先序遍历每一个节点,并判断两个节点是否在该节点的左右分支上,在,则该节点即是最低公共祖先,否则,继续遍历查找)
Node* GetLastCommonParent2(Node* pNode1,Node* pNode2)
{
return _GetLastCommonParent2(_pRoot,pNode1,pNode2);
}
//树中两个节点的最低公共祖先---实现2(重复遍历节点并进行判断,该方法的时间消耗大)
Node* _GetLastCommonParent2(Node* pRoot,Node* pNode1,Node* pNode2)
{
if(pRoot==NULL || pNode1==NULL ||pNode2==NULL)
return NULL;
Node* pCur = NULL;
if(IsFindNode(pRoot,pNode1) && IsFindNode(pRoot,pNode2))//若在根为pRoot的子树中查找到pNode和pNode2,则继续向下寻找,若找不到,二叉树的根为最低祖先
{
if(pCur=<