您的位置:首页 > 编程语言 > C语言/C++

二叉树深度优先遍历和广度优先遍历【C++】

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

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

[cpp] view
plaincopy

void DepthFirstTravel(Tree *root)  

{  

    stack<Tree *> s;  

    s.push(root);  

    while(!s.empty())  

    {  

        root = s.top();  

        cout << root->data << " ";  

        s.pop();  

        if(root->rchild != NULL)  

        {  

            s.push(root->rchild);  

        }  

        if(root->lchild != NULL)  

        {  

            s.push(root->lchild);  

        }  

  

    }  

}  

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

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

[cpp] view
plaincopy

void BreadthFirstTravel(Tree *root)  

{  

    queue<Tree *> q;  

    q.push(root);  

    while(!q.empty())  

    {  

        root = q.front();  

        cout << root->data << " ";  

        q.pop();  

        if(root->lchild != NULL)  

        {  

            q.push(root->lchild);  

        }  

        if(root->rchild != NULL)  

        {  

            q.push(root->rchild);  

        }  

    }  

}  

好了,这些看上去挺简单的,但是我想,在我们头脑中越是简单的东西,我们的大脑越是喜欢忽视,所以,有必要写一下加强一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 数据结构