二叉树

版权所有,转载请注明出处,谢谢!
http://blog.csdn.net/walkinginthewind/article/details/7518888
树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等等。本文努力对二叉树相关题目做一个较全的整理总结,希望对找工作的同学有所帮助。

二叉树节点定义如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};

相关链接:
轻松搞定面试中的链表题目

题目列表:

  1. 求二叉树中的节点个数
  2. 求二叉树的深度
  3. 前序遍历,中序遍历,后序遍历
    4.分层遍历二叉树(按层次从上往下,从左往右)
  4. 将二叉查找树变为有序的双向链表
  5. 求二叉树第K层的节点个数
  6. 求二叉树中叶子节点的个数
  7. 判断两棵二叉树是否结构相同
  8. 判断二叉树是不是平衡二叉树
  9. 求二叉树的镜像
  10. 求二叉树中两个节点的最低公共祖先节点
  11. 求二叉树中节点的最大距离
  12. 由前序遍历序列和中序遍历序列重建二叉树
    14.判断二叉树是不是完全二叉树

详细解答

  1. 求二叉树中的节点个数
    递归解法:
    (1)如果二叉树为空,节点个数为0
    (2)如果二叉树不为空,二叉树节点个数 = 左子树节点个数 + 右子树节点个数 + 1
    参考代码如下:
    [cpp] view plain copy
    int GetNodeNum(BinaryTreeNode * pRoot)
    {
    if(pRoot == NULL) // 递归出口
    return 0;
    return GetNodeNum(pRoot->m_pLeft) + GetNodeNum(pRoot->m_pRight) + 1;
    }
  2. 求二叉树的深度
    递归解法:
    (1)如果二叉树为空,二叉树的深度为0
    (2)如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1
    参考代码如下:
    [cpp] view plain copy
    int GetDepth(BinaryTreeNode * pRoot)
    {
    if(pRoot == NULL) // 递归出口
    return 0;
    int depthLeft = GetDepth(pRoot->m_pLeft);
    int depthRight = GetDepth(pRoot->m_pRight);
    return depthLeft > depthRight ? (depthLeft + 1) : (depthRight + 1);
    }
  3. 前序遍历,中序遍历,后序遍历
    前序遍历递归解法:
    (1)如果二叉树为空,空操作
    (2)如果二叉树不为空,访问根节点,前序遍历左子树,前序遍历右子树
    参考代码如下:
    [cpp] view plain copy
    void PreOrderTraverse(BinaryTreeNode * pRoot)
    {
    if(pRoot == NULL)
    return;
    Visit(pRoot); // 访问根节点
    PreOrderTraverse(pRoot->m_pLeft); // 前序遍历左子树
    PreOrderTraverse(pRoot->m_pRight); // 前序遍历右子树
    }
    中序遍历递归解法
    (1)如果二叉树为空,空操作。
    (2)如果二叉树不为空,中序遍历左子树,访问根节点,中序遍历右子树
    参考代码如下:
    [cpp] view plain copy
    void InOrderTraverse(BinaryTreeNode * pRoot)
    {
    if(pRoot == NULL)
    return;
    InOrderTraverse(pRoot->m_pLeft); // 中序遍历左子树
    Visit(pRoot); // 访问根节点
    InOrderTraverse(pRoot->m_pRight); // 中序遍历右子树
    }
    后序遍历递归解法
    (1)如果二叉树为空,空操作
    (2)如果二叉树不为空,后序遍历左子树,后序遍历右子树,访问根节点
    参考代码如下:
    [cpp] view plain copy
    void PostOrderTraverse(BinaryTreeNode * pRoot)
    {
    if(pRoot == NULL)
    return;
    PostOrderTraverse(pRoot->m_pLeft); // 后序遍历左子树
    PostOrderTraverse(pRoot->m_pRight); // 后序遍历右子树
    Visit(pRoot); // 访问根节点
    }
    4.分层遍历二叉树(按层次从上往下,从左往右)

相当于广度优先搜索,使用队列实现。队列初始化,将根节点压入队列。当队列不为空,进行如下操作:弹出一个节点,访问,若左子节点或右子节点不为空,将其压入队列。
[cpp] view plain copy
void LevelTraverse(BinaryTreeNode * pRoot)
{
if(pRoot == NULL)
return;
queue

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值