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

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

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


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


转载请注明: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.上述方面,笔者也有欠缺,希望和大家交流探讨!


相关文章
|
2天前
|
存储 算法 程序员
数据结构与算法===递归
数据结构与算法===递归
|
2天前
|
C++
【洛谷 P1044】[NOIP2003 普及组] 栈 题解(递归+记忆化搜索)
**NOIP2003普及组栈问题**:给定操作数序列1到n,仅允许push(进栈)和pop(出栈)操作。目标是计算所有可能的输出序列总数。输入包含一个整数n(1≤n≤18)。示例输入3,输出5。当队列空时返回1,栈空则只能入栈,栈非空时可入栈或出栈。AC C++代码利用记忆化搜索求解。
5 1
|
16天前
|
算法
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
23 1
|
16天前
|
存储 算法
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
10 0
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
|
12天前
|
存储 算法 大数据
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
|
13天前
|
存储 算法 数据挖掘
数据结构面试常见问题:解锁10大关键问题及答案解析【图解】
数据结构面试常见问题:解锁10大关键问题及答案解析【图解】
|
16天前
|
算法
数据结构和算法学习记录——认识二叉搜索树及二叉搜索树的查找操作(递归以及迭代实现-查找操作、查找最大和最小元素)
数据结构和算法学习记录——认识二叉搜索树及二叉搜索树的查找操作(递归以及迭代实现-查找操作、查找最大和最小元素)
11 0
|
16天前
|
存储 机器学习/深度学习 算法
数据结构和算法学习记录——空间复杂度的计算(冒泡排序、阶乘递归、斐波那契数列递归、常见复杂度对比、栈帧、栈溢出)
数据结构和算法学习记录——空间复杂度的计算(冒泡排序、阶乘递归、斐波那契数列递归、常见复杂度对比、栈帧、栈溢出)
7 0
|
17天前
|
存储 关系型数据库 MySQL
万字详细面试被吊打的总结(SE->数据结构->MYSQL)
万字详细面试被吊打的总结(SE->数据结构->MYSQL)
|
1天前
|
设计模式 SQL JavaScript
java面试宝典全套含答案
java面试宝典全套含答案