美文网首页
二叉树深度优先遍历(非递归)

二叉树深度优先遍历(非递归)

作者: 祝方泽 | 来源:发表于2018-03-10 16:58 被阅读0次

思路就是“栈”,我不知道还有第二种思路,知道的同学可以交流

深度遍历:

( top_node )表示当前的根节点(即栈顶),( poped_node )记录最近出栈的节点最近出栈的节点一定是栈顶的子节点,因为入栈节点是栈顶的子节点,所以出栈节点,一定是栈顶的子节点。本人认为这是关键,没有这一点,就不能证明算法是正确的)

算法:

如果栈顶存在,则根据 栈顶 和 最近弹出的子节点,决定下一步要做什么。每一步维护 栈顶 和 最近弹出的子节点。

void dfs(root)

    if (root == NULL) return // 边界情况尽早处理

    stack = new Stack()

    stack.push(root)

    poped_node = NULL

    while (not stack.empty())  // 栈中存在根节点

             top_node = stack.top()   // top() 只取值,不出栈

            if (poped_node == NULL) { // 子节点未出栈

                    if ( top_node有在左子树 ) 左子树入栈

                    else if ( top_node有右子树 ) 右子树入栈

                    else {

                            stack.pop()

                            poped_node = top_node

                    }

            } else {  // 子节点出栈

                    if (poped_node == top_node.left_node) {

                            if ( top_node有右子树 ) 右子树入栈

                            else {

                                    stack.pop()

                                    poped_node = top_node

                            }

                    }

                    else if ( poped_node == top_node.right_node ) {

                            stack.pop()

                            poped_node = top_node

                    }

                    else {

                            raise Exception("出栈节点非栈顶的子节点,请检查算法逻辑")

                     }

            }

    }

先序,中序,后序,本质都是深度优先遍历,只需要在上面代码中插入打印语句;

先序遍历:左子树入栈前,打印出根节点;简单说,就是入栈时,同时打印

中序遍历:左子树出站后,打印出根节点;简单说,就是栈顶没有左子树,或者左子树出站后,打印栈顶

后序遍历:右子树出栈后,打印根节点;简单说,就是栈顶出栈时,同时打印

相关文章

  • 5. 深度优先、广度优先

    1. 二叉树的深度优先遍历和广度优先遍历2. 深度优先搜索递归和非递归实现 深度优先(DFS):前序遍历 广度优先...

  • 深度优先遍历&广度优先遍历

    二叉树的[深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列 深度优先遍历中,具体分...

  • 前端面试考点之数据结构

    1、深度优先和广度优先的区别 1) 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法...

  • 二叉树遍历(先序、中序、后序)

    二叉树有多种遍历方法,有层次遍历、深度优先遍历、广度优先遍历等。 本文只涉及二叉树的先序、中序、后序的递归和非递归...

  • 二叉树非递归遍历(先序、中序、后序)

    二叉树有多种遍历方法,有层次遍历、深度优先遍历、广度优先遍历等。 本文只涉及二叉树的先序、中序、后序的递归和非递归...

  • 二叉树

    深度优先遍历 递归 DFS 广度优先遍历 递归BFS 二叉树的最大最小深度 判断二叉树是否中轴对称

  • 总结

    1、二叉树广度遍历(非递归) 广度遍历非递归实现需要依靠一个队列。 2、二叉树深度遍历(递归与非递归,前序,中序和...

  • 深度优先遍历和广度优先遍历

    以html节点为列进行深度优先和广度优先遍历 1. 深度优先遍历 递归 非递归,栈表示法 2. 广度优先遍历 队列表示法

  • javascript实现多叉树 深度优先遍历和广度优先遍历(代码

    本文目录 回顾数组本篇使用的五个方法 深度优先遍历 (递归方法) 思路+代码 深度优先遍历 (非递归方法) 思...

  • 遍历树

    遍历一棵二叉树的方式有两种: 深度优先遍历 广度优先遍历 每一种遍历方式又有不同的遍历方法: 深度优先遍历递归基于...

网友评论

      本文标题:二叉树深度优先遍历(非递归)

      本文链接:https://www.haomeiwen.com/subject/svhbfftx.html