美文网首页
二叉树遍历(先序遍历、中序遍历、后序遍历)——递归方法和非递归方

二叉树遍历(先序遍历、中序遍历、后序遍历)——递归方法和非递归方

作者: SinX竟然被占用了 | 来源:发表于2017-09-17 13:06 被阅读0次

注:本文来自 左程云的书《程序员代码面试指南》

题目:
分别用递归和非递归方法,实现二叉树的先序遍历(根左右)、中序遍历(左根右)、后序遍历(左右根)。
// 二叉树节点
class Node {
public int value;
public Node left;
public Node right;

public Node(int value) {
    this.value = value;
}

}

1、递归方式Recursion
(1)先序遍历
public void preOrderRecur(Node root) {

    if(root == null) {
        return;
    }
    //先输出根节点的值
    System.out.println(root.value + " ");
    //递归左子树
    preOrderRecur(root.left);
    //递归右子树
    preOrderRecur(root.right);
}

(2)中序遍历
public void inOrderRecur(Node root) {

    if(root == null) {
        return;
    }
    inOrderRecur(root.left);
    System.out.println(root.value + " ");
    inOrderRecur(root.right);
}

(3)后序遍历
public void posOrderRecur(Node root) {

    if(root == null) {
        return;
    }
    posOrderRecur(root.left);
    posOrderRecur(root.right);
    System.out.println(root.value + " ");
}

2、非递归方式UnRecursion
使用自定义的栈来代替递归栈。
(1)先序遍历
public void preOrderUnRecur(Node root) {

    if(root != null) {
        Node curNode = root;    //当前节点
        Stack<Node> stack = new Stack<>();  //辅助栈
        stack.add(root);
        
        while(!stack.isEmpty()) {
            curNode = stack.pop();
            System.out.println(curNode.value + " ");
            if(curNode.right != null) {
                stack.push(curNode.right);
            }
            if(curNode.left != null) {
                stack.push(curNode.left);
            }
        }
    }
}

(2)中序遍历
public void inOrderUnRecur(Node root) {

    if(root != null) {
        Node curNode = root;    //当前节点
        Stack<Node> stack = new Stack<>();  //辅助栈
        
        while(!stack.isEmpty() || curNode != null) {
            if(curNode != null) {
                stack.push(curNode);
                curNode = curNode.left;
            }
            else {
                curNode = stack.pop();
                //输出
                System.out.println(curNode.value + " ");
                curNode = curNode.right;
            }
        }
        
    }
}

(3)后序遍历
方法一:使用 两个 辅助栈
public void posOrderUnRecur(Node root) {

    if(root != null) {
        Node curNode = root;    //当前节点
        Stack<Node> stack1 = new Stack<>();
        Stack<Node> stack2 = new Stack<>();
        stack1.push(curNode);
        
        while(!stack1.isEmpty()) {
            curNode = stack1.pop();
            stack2.push(curNode);
            if(curNode.left != null) {
                stack1.push(curNode.left);
            }
            if(curNode.right != null) {
                stack1.push(curNode.right);
            }
        }
        
        //弹出stack2中所有元素
        while(!stack2.isEmpty()) {
            System.out.println(stack2.pop().value + " ");
        }
    }
}

方法二:使用一个辅助栈
//TODO

相关文章

  • 二叉树的遍历算法

    递归版本 先序遍历: 中序遍历: 后序遍历: 非递归版本 先序遍历: 中序遍历: 后序遍历: 层次遍历:

  • 二叉树遍历

    先序遍历——[递归、非递归] 中序遍历——[递归、非递归] 后序遍历——[递归、非递归] 层次遍历——[递归、非递归]

  • goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序

    goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序遍历 层序遍历) 前序遍历 中序遍历 后序遍历 代...

  • 树的遍历

    节点结构: 先序遍历 递归 非递归 后序遍历 递归 非递归 中序遍历 递归 非递归 层序遍历 类库 有了上述遍历算...

  • 二叉树的遍历

    非递归前序遍历 非递归中序遍历 非递归后序遍历 层序遍历

  • 二叉树遍历-JAVA实现

    基础二叉树 二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。 前序递归遍历算法:访问根结点-->递归...

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

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

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

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

  • 树的遍历,golang实现

    先序,递归 中序,递归 后序,递归 先序,非递归 中序,非递归 后序,非递归 层序遍历

  • 二叉树先序、中序、后序遍历 递归与非递归 Python实现 1.先序遍历:根节点->左子树->右子树 2.中序遍历...

网友评论

      本文标题:二叉树遍历(先序遍历、中序遍历、后序遍历)——递归方法和非递归方

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