zoukankan      html  css  js  c++  java
  • 二叉树的深度优先遍历和广度优先遍历

    深度优先遍历(栈,先压右节点,再压左节点)

    也就深入的遍历,沿着每一个分支直到走到最后,然后才返回来遍历剩余的节点。二叉树不同于图,图需要标记节点是否已经访问过,因为可能会存在环,而二叉树不会出现环,所以不需要标记。那么,我们只需要一个栈空间,来压栈就好了。因为深度优先遍历,遍历了根节点后,就开始遍历左子树,所以右子树肯定最后遍历。我们利用栈的性质,先将右子树压栈,然后在对左子树压栈。此时,左子树节点是在top上的,所以可以先去遍历左子树。

    如下是深度优先遍历的代码:

     1 void DepthFirstTravel(Tree *root)  
     2 {  
     3     stack<Tree *> s;  
     4     s.push(root);  
     5     while(!s.empty())  
     6     {  
     7         root = s.top();  
     8         cout << root->data << " ";  
     9         s.pop();  
    10         if(root->rchild != NULL)  
    11         {  
    12             s.push(root->rchild);  
    13         }  
    14         if(root->lchild != NULL)  
    15         {  
    16             s.push(root->lchild);  
    17         }  
    18   
    19     }  
    20 }  
    

    广度优先遍历二叉树(队列:先压左节点,再压右节点)

    也就是按层次的去遍历。依次遍历根节点,然后是左孩子和右孩子。所以要遍历完当前节点的所有孩子,这样才是层次遍历嘛。此时我们就不能用栈这个数据结构了,因为栈只能在栈顶操作。在这里,我们需要根据左右孩子的顺序来输出,所以就是先进先出的原则,那么我们当然就想到了队列这个数据结构。可以在rear依次插入左右孩子,在front依次读取并删除左右孩子,这样就保证了层次的输出。

    下面是二叉树的广度优先遍历代码:

     1 void BreadthFirstTravel(Tree *root)  
     2 {  
     3     queue<Tree *> q;  
     4     q.push(root);  
     5     while(!q.empty())  
     6     {  
     7         root = q.front();  
     8         cout << root->data << " ";  
     9         q.pop();  
    10         if(root->lchild != NULL)  
    11         {  
    12             q.push(root->lchild);  
    13         }  
    14         if(root->rchild != NULL)  
    15         {  
    16             q.push(root->rchild);  
    17         }  
    18     }  
    19 }  
    
  • 相关阅读:
    Codeforces 916E Jamie and Tree (换根讨论)
    BZOJ 3083 遥远的国度 (换根讨论 + 树链剖分)
    Codeforces 703D Mishka and Interesting sum(离线 + 树状数组)
    ECNU 3480 没用的函数 (ST表预处理 + GCD性质)
    HDU 4343 Interval query(贪心 + 倍增)
    Codeforces 147B Smile House(DP预处理 + 倍增)
    HDU 4870 Rating (高斯消元)
    TopCoder SRM 301 Div2 Problem 1000 CorrectingParenthesization(区间DP)
    Hrbust 2320 OX (博弈)
    Hrbust 2319 Number Game(贪心)
  • 原文地址:https://www.cnblogs.com/lixuejian/p/13398774.html
Copyright © 2011-2022 走看看