zoukankan      html  css  js  c++  java
  • 二叉树的深度,递归和非递归实现

    递归实现基本思想:

    为了求得树的深度,可以先求左右子树的深度,取二者较大者加1即是树的深度,递归返回的条件是若节点为空,返回0

    算法:

    1 int FindTreeDeep(BinTree BT){
    2      int deep=0;
    3      if(BT){
    4          int lchilddeep=FindTreeDeep(BT->lchild);
    5          int rchilddeep=FindTreeDeep(BT->rchild);
    6          deep=lchilddeep>=rchilddeep?lchilddeep+1:rchilddeep+1;
    7      }
    8      return deep;
    9 }

    非递归实现基本思想:

    受后续遍历二叉树思想的启发,想到可以利用后续遍历的方法来求二叉树的深度,在每一次输出的地方替换成算栈S的大小,遍历结束后最大的栈S长度即是栈的深度。

    算法的执行步骤如下:

    (1)当树非空时,将指针p指向根节点,p为当前节点指针。

    (2)将p压入栈S中,0压入栈tag中,并令p执行其左孩子。

    (3)重复步骤(2),直到p为空。

    (4)如果tag栈中的栈顶元素为1,跳至步骤(6)。从右子树返回

    (5)如果tag栈中的栈顶元素为0,跳至步骤(7)。从左子树返回

    (6)比较treedeep与栈的深度,取较大的赋给treedeep,对栈S和栈tag出栈操作,p指向NULL,并跳至步骤(8)。

    (7)将p指向栈S栈顶元素的右孩子,弹出栈tag,并把1压入栈tag。(另外一种方法,直接修改栈tag栈顶的值为1也可以)

    (8)循环(2)~(7),直到栈为空并且p为空

    (9)返回treedeep,结束遍历

     1 int TreeDeep(BinTree BT ){
     2     int treedeep=0;
     3     stack S;
     4     stack tag;
     5     BinTree p=BT;
     6     while(p!=NULL||!isEmpty(S)){
     7         while(p!=NULL){
     8             push(S,p);
     9             push(tag,0);
    10             p=p->lchild;
    11         }
    12         if(Top(tag)==1){
    13             deeptree=deeptree>S.length?deeptree:S.length;
    14             pop(S);
    15             pop(tag);
    16             p=NULL;
    17         }else{
    18             p=Top(S);
    19             p=p->rchild;
    20             pop(tag);
    21             push(tag,1);
    22         }
    23     }
    24     return deeptree;
    25 }
  • 相关阅读:
    Java多线程_同步工具CountDownLatch
    Java多线程_Semaphore信号量
    Java多线程_ReentrantLock
    Java多线程_CAS算法和ABA问题
    Java多线程_Atomic
    Java多线程_生产者消费者模式2
    Java多线程_生产者消费者模式1
    Java多线程_阻塞队列
    Java多线程_wait/notify/notifyAll方法
    Java多线程同步_synchronized
  • 原文地址:https://www.cnblogs.com/GoAhead/p/2513847.html
Copyright © 2011-2022 走看看