二叉树问题

来源:互联网 发布:触摸屏校准软件下载 编辑:程序博客网 时间:2024/05/20 00:49

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

二叉树节点定义如下:

</pre><p style="font-size: 14px;"><pre name="code" class="cpp" style="color: rgb(51, 51, 51); font-family: Arial;">
int a;int b;cout << a;
int a;
#include <iostream>int main(){    return 0;}

hello

[cpp] view plain copy
  1. int GetNodeNum(BinaryTreeNode * pRoot)  
  2. {  
  3.     if(pRoot == NULL) // 递归出口  
  4.         return 0;  
  5.     return GetNodeNum(pRoot->m_pLeft) + GetNodeNum(pRoot->m_pRight) + 1;  
  6. int 





  1. }sd
  2. sd
  3. sd


  4. sd










  5.   



ds



</pre><pre name="code" class="cpp">

int a;



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

题目列表:

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

</pre><a target=_blank target="_blank" href="http://blog.csdn.net/luckyxiaoqiang/article/details/7518888#topic13" style="color: rgb(51, 102, 153); text-decoration: none;">13. 由前序遍历序列和中序遍历序列重建二叉树</a><a target=_blank target="_blank" href="http://blog.csdn.net/luckyxiaoqiang/article/details/7518888#topic14" style="color: rgb(51, 102, 153); text-decoration: none;">14.判断二叉树是不是完全二叉树</a><p></p><p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px;"><strong>详细解答</strong></p><p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px;"><strong><a target=_blank target="_blank" name="topic1" style="color: rgb(51, 102, 153);">1. 求二叉树中的节点个数</a></strong>递归解法:(1)如果二叉树为空,节点个数为0(2)如果二叉树不为空,二叉树节点个数 = 左子树节点个数 + 右子树节点个数 + 1参考代码如下:</p><div class="dp-highlighter bg_cpp" style="font-family: Consolas, "Courier New", Courier, mono, serif; background-color: rgb(231, 229, 220); width: 700.906px; overflow-x: auto; overflow-y: hidden; padding-top: 1px; position: relative; color: rgb(51, 51, 51); margin: 18px 0px !important;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="padding: 3px 8px 10px 10px; font-stretch: normal; font-size: 9px; line-height: normal; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; color: silver; background-color: rgb(248, 248, 248); border-left: 3px solid rgb(108, 226, 108);"><strong></strong><pre name="code" class="cpp">hello

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

4.分层遍历二叉树(按层次从上往下,从左往右)

相当于广度优先搜索,使用队列实现。队列初始化,将根节点压入队列。当队列不为空,进行如下操作:弹出一个节点,访问,若左子节点或右子节点不为空,将其压入队列。

[cpp] view plain copy
  1. void LevelTraverse(BinaryTreeNode * pRoot)  
  2. {  
  3.     if(pRoot == NULL)  
  4.         return;  
  5.     queue<BinaryTreeNode *> q;  
  6.     q.push(pRoot);  
  7.     while(!q.empty())  
  8.     {  
  9.         BinaryTreeNode * pNode = q.front();  
  10.         q.pop();  
  11.         Visit(pNode); // 访问节点  
  12.         if(pNode->m_pLeft != NULL)  
  13.             q.push(pNode->m_pLeft);  
  14.         if(pNode->m_pRight != NULL)  
  15.             q.push(pNode->m_pRight);  
  16.     }  
  17.     return;  
  18. }  
5. 将二叉查找树变为有序的双向链表

要求不能创建新节点,只调整指针。
递归解法:
(1)如果二叉树查找树为空,不需要转换,对应双向链表的第一个节点是NULL,最后一个节点是NULL
(2)如果二叉查找树不为空:
如果左子树为空,对应双向有序链表的第一个节点是根节点,左边不需要其他操作;
如果左子树不为空,转换左子树,二叉查找树对应双向有序链表的第一个节点就是左子树转换后双向有序链表的第一个节点,�%9
0 0