• 第三节.二叉树和分治法


    tips:

    1.记住(背)如何用栈来实现非递归法的前序遍历和中序遍历。(二叉查找树的迭代器这一题,对理解非递归的中序遍历很有帮助)

    非递归法的二叉树前序遍历:

    public class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            Stack<TreeNode> stack = new Stack<TreeNode>();
            List<Integer> preorder = new ArrayList<Integer>();
            
            if (root == null) {
                return preorder;
            }
            
            stack.push(root);
            while (!stack.empty()) {
                TreeNode node = stack.pop();
                preorder.add(node.val);
                if (node.right != null) {
                    stack.push(node.right);
                }
                if (node.left != null) {
                    stack.push(node.left);
                }
            }
            
            return preorder;
        }
    }

    非递归法的二叉树中序遍历

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

    2.区分递归和分治。分治是一种算法,递归是程序的一种实现方式。递归不一定有分治的思想,例如在二叉树遍历中,遍历法也是用递归实现的,但它不是分治法。90%的二叉树题目考虑用分治法。

    3涉及层序遍历的题目要用BFS,通常用栈或者队列实现。传统层序遍历用一个队列实现,zigzag层序遍历用两个栈实现,自底向上的层序遍历用一个队列和一个栈实现。

    4了解一下用DFS来做层序遍历。

  • 相关阅读:
    单向链表的创建、输出、插入、删除
    linux文件管理指令
    二叉树的创建与遍历(递归)
    小工具
    排序
    Project Euler Problem (1~10)
    福大软工 · 最终作业
    福大软工 · 第十二次作业
    Beta冲刺 7
    Beta冲刺 6
  • 原文地址:https://www.cnblogs.com/coldyan/p/5844658.html
Copyright © 2020-2023  润新知