设为首页 加入收藏

TOP

轻松搞定面试中的二叉树题目
2014-11-23 22:06:49 来源: 作者: 【 】 浏览:8
Tags:轻松 搞定 面试 题目

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


参考代码如下:


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


参考代码如下:


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)如果二叉树不为空,访问根节点,前序遍历左子树,前序遍历右子树


参考代码如下:


void PreOrderTraverse(BinaryTreeNode * pRoot)
{
if(pRoot == NULL)
return;
Visit(pRoot); // 访问根节点
PreOrderTraverse(pRoot->m_pLeft); // 前序遍历左子树
PreOrderTraverse(pRoot->m_pRight); // 前序遍历右子树
}


中序遍历递归解法


(1)如果二叉树为空,空操作。


(2)如果二叉树不为空,中序遍历左子树,访问根节点,中序遍历右子树


参考代码如下:


void InOrderTraverse(BinaryTreeNode * pRoot)
{
if(pRoot == NULL)
return;
InOrderTraverse(pRoot->m_pLeft); // 中序遍历左子树
Visit(pRoot); // 访问根节点
InOrderTraverse(pRoot->m_pRight); // 中序遍历右子树
}


后序遍历递归解法


(1)如果二叉树为空,空操作


(2)如果二叉树不为空,后序遍历左子树,后序遍历右子树,访问根节点


参考代码如下:


void PostOrderTraverse(BinaryTreeNode * pRoot)
{
if(pRoot == NULL)
return;
PostOrderTraverse(pRoot->m_pLeft); // 后序遍历左子树
PostOrderTraverse(pRoot->m_pRight); // 后序遍历右子树
Visit(pRoot); // 访问根节点
}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇AngularJS 的自定义指令 下一篇使用Python进行线程编程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: