数据结构面试之五—二叉树的常见操作(递归实现部分)

数据结构面试之五—二叉树的常见操作(递归实现部分)

题注:《面试宝典》有相关习题,但思路相对不清晰,排版有错误,作者对此参考相关书籍和自己观点进行了重写,供大家参考。

转载请注明:http://blog.csdn.net/wojiushiwo987/article/category/1210932

五、二叉树的基本操作(递归实现)

    二叉树是笔试、面试的重点,包括选择题的题型之——求解前、中、后序的遍历结果等。去年(2011秋季)的百度笔试试题就考察了二叉树的后序遍历的非递归实现。

    笔者先就下面常考几个题目就递归算法的实现分析如下:

递归的核心就是遍历完根节点后,再依次同样的方法递归左孩子、右孩子节点,直到为空为止!

1.中根遍历

//中序:左->根->右[递归实现]

  template<typename elemType>
       voidbinaryTreeType<elemType>::inorder(nodeType<elemType> *p)
       {
              if( p != NULL )
              {
                     inorder(p->llink);
                     cout << p->info << " ";
                     inorder(p->rlink);
              }
       }

2.先根遍历

       //前序:根->左->右[递归实现]

      

 template<typename elemType>
       voidbinaryTreeType<elemType>::preorder(nodeType<elemType> *p)
       {    
              if( p != NULL )
              {
                     cout << p->info << " ";
                     preorder(p->llink);
                     preorder(p->rlink);
              }    
       }

3.后根遍历

       //后序:左->右->根[递归实现]

 template<typename elemType>
       voidbinaryTreeType<elemType>::postorder(nodeType<elemType> *p)
       {
              if( p != NULL )
              {
                     postorder(p->llink);
                     postorder(p->rlink);
                     cout << p->info << " ";
              }
       }


4.//求树的高度![递归实现]

   //等于左右子树的最大高度+1

 

      template<typename elemType>
       intbinaryTreeType<elemType>::height(nodeType<elemType> *p)
       {
              if( p == NULL)
              {
                     return 0;
              }
              else
              {
                     return 1 + max( height(p->llink),height(p->rlink)); //加上根节点1层..
              }
       }
 
   //辅助max
       template<typename elemType>
       int binaryTreeType<elemType>::max(int x, int y)
       {
              return ( x >= y ? x : y );
       }

5./全部/节点数目统计[递归实现]

 

   template<typename elemType>
       int binaryTreeType<elemType>::nodeCount(nodeType<elemType>*p)
       {    
              if(p == NULL)
              {
                     return 0;
              }
              else
              {
                     return 1 + nodeCount(p->llink) +nodeCount(p->rlink);
              }
      
       }

6.//叶节点数目[递归实现]

//叶子节点的特征就是左右子树为空。

  

     template<typename elemType>
       intbinaryTreeType<elemType>::leavesCount(nodeType<elemType> *p)
       {
              if(p == NULL)
              {
                     return 0;
              }
              else if(p->llink == NULL && p->rlink ==NULL)
              {
                     return 1; //
              }
              else
              {
                     return leavesCount(p->llink) +leavesCount(p->rlink);
              }
       }

7.判定两颗二叉树是否相等

【思路】:逐个节点(从根节点开始)进行比对,可能出现二叉树1自根节点左子树与二叉树2自根节点的右子树完全一致的情况,或者反之,这种情况也视为两颗二叉树一致。

分为一下5种情况。

       

template<typename elemType>
       boolbinaryTreeType<elemType>::beTreesEqual(nodeType<elemType> *first,nodeType<elemType> *second)
       {
              bool isFirstTreeNull = (first == NULL);
              bool isSecondTreeNull = (second == NULL);
 
              //case1: 两者不等.
              if(isFirstTreeNull != isSecondTreeNull)
              {
                     return false;
              }
              //case2: 两者都为非空.
              if(isFirstTreeNull == true &&isSecondTreeNull==true)
              {
                     return true;
              }
              //case3: 两者都非空,但两者的节点值不等
              //case4: 两者都非空,但节点值相等,需要考虑左右分支的情况...
              if(!isFirstTreeNull && !isSecondTreeNull)
              {
                     if(first->info != second->info) //节点值是否相等
                     {
                            return false;
                     }
                     else
                     {
                            return((beTreesEqual(first->llink,second->llink) &&beTreesEqual(first->rlink,second->rlink))
                                      ||(beTreesEqual(first->llink,second->rlink) &&beTreesEqual(first->rlink,second->llink)));
                     }//
              }//end if
              return false;
       }

建议:

       1.代码不是目的,主要是分析问题的思路;

       2.可以自己画一个二叉树的草图结构,然后根据程序进行代码走读,而后理清思路,再写出代码才是王道!

       3.上述方面,笔者也有欠缺,希望和大家交流探讨!

1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页