代码随想录算法训练营第十三天| 144. 二叉树的前序遍历、145. 二叉树的后序遍历、94. 二叉树的中序遍历

144. 二叉树的前序遍历(递归)

public List<Integer> preorderTraversal(TreeNode root) {
    List<Integer> ans = new ArrayList<>();
    preOrder(root, ans);
    return ans;
}

//节点和结果数组为参数
//返回下一个要返回的节点 返回void 仅打印
//如果返回的节点为空,则终止
public  void preOrder(TreeNode treeNode, List<Integer> ans) {
    if (treeNode == null) {
        return;
    } else {
        ans.add(treeNode.val);
        preOrder(treeNode.left, ans);
        preOrder(treeNode.right, ans);
    }
}

145. 二叉树的后序遍历(递归)

public List<Integer> postorderTraversal(TreeNode root) {
    List<Integer> ans = new ArrayList<>();
    postOrder(root, ans);
    return ans;
}

public  void postOrder(TreeNode treeNode, List<Integer> ans) {
    if (treeNode == null) {
        return;
    } else {

        postOrder(treeNode.left, ans);
        postOrder(treeNode.right, ans);
        ans.add(treeNode.val);
    }
}

94. 二叉树的中序遍历(递归)

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> ans = new ArrayList<>();
    inOrder(root, ans);
    return ans;
}
public  void inOrder(TreeNode treeNode, List<Integer> ans) {
    if (treeNode == null) {
        return;
    } else {

        inOrder(treeNode.left, ans);
        ans.add(treeNode.val);
        inOrder(treeNode.right, ans);

    }
}

144. 二叉树的前序遍历(栈)

List<Integer> ans = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
if (root == null) {
    return ans;
}
while (root != null || !stack.isEmpty()) {
    while (root != null) {
        stack.push(root);
        ans.add(root.val);
        root = root.left;
    }
    TreeNode peek = stack.peek();
    stack.pop();
    root = peek.right;
}
return ans;

94. 二叉树的中序遍历(栈)

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> ans = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();
    if (root == null) {
        return ans;
    }
    while (root != null || !stack.isEmpty()) {
        while (root != null) {
            stack.push(root);
            root = root.left;
        }
        TreeNode peek = stack.peek();
        stack.pop();
        ans.add(peek.val);
        root = peek.right;
    }
    return ans;
}

145. 二叉树的后序遍历(栈)

//存放遍历的结果List
List<Integer> ans = new ArrayList<>();
//pre表示遍历时前面一个已经遍历过的结点
TreeNode pre = null;
Stack<TreeNode> stack = new Stack<>();
//如果栈中还有元素,或者当前结点t非空
while (!stack.isEmpty() || root != null) {
    //顺着左子树走 并且将所有的元素压入栈中
    while (root != null) {
        stack.push(root);
        root = root.left;
    }
    //当没有任何元素可以压栈的时候
    //拿栈顶元素,注意这里并不将栈顶元素弹出
    //因为在迭代时,根结点需要遍历两次,这里需要判断一下
    //右子树是否遍历完毕
    root = stack.peek();
    ///如果要遍历当前结点,需要确保右子树已经遍历完毕
    //如果当前结点右子树为空,那么右子树没有遍历的必要
    //需要将当前结点放到ans中
    //当t.right== pre时,说明右子树已经被打印过了
    //那么此时需要将当前结点放到ans中

    if (root.right == null || root.right == pre) {
        ///右子树已经遍历完毕,放到ans中
        ans.add(root.val);
        // 弹栈
        stack.pop();
        //因为已经遍历了当前结点,所以需要更新pre结点pre
        pre = root;
        //已经打印完毕。需要设置为空,否则下一轮循环
        //还会遍历t的左子树。
        root = null;
    } else {
        //第一次走到t结点,不能放到ans中,因为t的右子树还没有遍历
        //需要将t结点的右子树遍历
        root = root.right;
    }
}

return ans;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值