LeetCode-二叉树

Posted nomad1c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode-二叉树相关的知识,希望对你有一定的参考价值。

二叉树的遍历,注意递归和非递归两种思路。

94. Binary Tree Inorder Traversal 二叉树中序遍历

https://leetcode.com/problems/binary-tree-inorder-traversal/

题目:给定二叉树,返回节点值的中序遍历。

思路:

class Solution 
    public List<Integer> inorderTraversal(TreeNode root) 
        List<Integer> list = new ArrayList<Integer>();
        if(root == null) return list;
        inShow(list, root);
        return list;
    
    
    public void inShow(List<Integer> l, TreeNode node) 
        if(node.left != null) 
            inShow(l, node.left);
        
        l.add(node.val);
        if(node.right != null) 
            inShow(l, node.right);
        
    

100. Same Tree 相同的树

https://leetcode.com/problems/same-tree/

题目:给定两个二叉树,编写一个函数来检查它们是否相同。如果两个二叉树在结构上相同,且节点具有相同的值,则它们被认为是相同的。

思路:

①:判断两棵树是否相同和之前的判断两棵树是否对称都是一样的原理,利用深度优先搜索DFS来递归。

②:还有非递归的解法,因为二叉树的四种遍历(层序,先序,中序,后序)均有各自的迭代和递归的写法,这里我们先来看先序的迭代写法,相当于同时遍历两个数,然后每个节点都进行比较。

class Solution 
    public boolean isSameTree(TreeNode p, TreeNode q) 
        if (p == null && q == null) return true;
        if ((p != null && q == null) || (p == null && q != null) || (p.val != q.val)) return false;
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    

129. Sum Root to Leaf Numbers 求根节点到叶节点的值的总和

http://oj.leetcode.com/problems/sum-root-to-leaf-numbers/

题目:如果一个二叉树只包含从0到9的数字,那么每个根到叶的路径都可以表示一个数字.一个例子是根对叶路径1->2->3,它表示数字123。找出所有根到叶数的总和。注意:叶子是一个没有子节点的节点。

思路:

class Solution 
    int tot = 0;
    public int sumNumbers(TreeNode root) 
        if(root==null)
            return 0;
        calc(root,0);
        return tot;
    
    
    public void calc(TreeNode root, int currsum) 
        currsum =currsum*10 + root.val;
        if(root.left==null && root.right==null)
            tot+=currsum;
            return;
        
        if(root.left!=null)
            calc(root.left,currsum);
        if(root.right!=null)
            calc(root.right,currsum);
        return;
    

144. Binary Tree Preorder Traversal 二叉树前序遍历

https://leetcode.com/problems/binary-tree-preorder-traversal/

题目:给定二叉树,返回其节点值的前序遍历。

思路:

class Solution 
    // 递归实现
    public List<Integer> preorderTraversal(TreeNode root) 
        List<Integer> list = new ArrayList<Integer>();
        if(root == null) return list;
        frontShow(list, root);
        return list;
    
    
    public void frontShow(List<Integer> l, TreeNode node) 
        l.add(node.val);
        if(node.left != null) 
            frontShow(l, node.left);
        
        if(node.right != null) 
            frontShow(l, node.right);
        
    
class Solution 
    // 非递归实现
    public List<Integer> preorderTraversal(TreeNode root) 
        List<Integer> list = new LinkedList<Integer>();
        Stack<TreeNode> rights = new Stack<TreeNode>();
        while(root != null) 
            list.add(root.val);
            if(root.right != null) 
                rights.push(root.right);
            
            root = root.left;
            if(root == null && !rights.isEmpty()) 
                root = rights.pop();
            
        
        return list;
    

145. Binary Tree Postorder Traversal 二叉树后序遍历

https://leetcode.com/problems/binary-tree-postorder-traversal/

题目:给定二叉树,返回节点值的后序遍历。

思路:

class Solution 
    // 递归实现
    public List<Integer> postorderTraversal(TreeNode root) 
        List<Integer> list = new ArrayList<Integer>();
        if(root == null) return list;
        backShow(list, root);
        return list;
    
    
    public void backShow(List<Integer> l, TreeNode node) 
        if(node.left != null) 
            backShow(l, node.left);
        
        if(node.right != null) 
            backShow(l, node.right);
        
        l.add(node.val);
    

// TODO

遍历变种:http://oj.leetcode.com/problems/path-sum/
遍历变种:http://oj.leetcode.com/problems/path-sum-ii/
遍历变种:http://oj.leetcode.com/problems/maximum-depth-of-binary-tree/
遍历变种:http://oj.leetcode.com/problems/minimum-depth-of-binary-tree/
重建二叉树:http://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
重建二叉树:http://oj.leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
层次遍历变种:http://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/
遍历变种:http://oj.leetcode.com/problems/symmetric-tree/
遍历应用:http://oj.leetcode.com/problems/binary-tree-maximum-path-sum/
遍历应用:http://oj.leetcode.com/problems/balanced-binary-tree/
遍历应用:http://oj.leetcode.com/problems/recover-binary-search-tree/
遍历应用:http://oj.leetcode.com/problems/flatten-binary-tree-to-linked-list/
level遍历:http://oj.leetcode.com/problems/binary-tree-level-order-traversal/
level 遍历:http://oj.leetcode.com/problems/binary-tree-level-order-traversal-ii/
level 遍历变种:http://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node/
level 遍历变种:http://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/

以上是关于LeetCode-二叉树的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-树二叉树的最近公共祖先

LeetCode-树二叉树的最近公共祖先

LeetCode-树二叉树的坡度

二叉树二叉搜索树中的众数(leetcode501)

二叉树二叉搜索树中的众数(leetcode501)

算法漫游指北(第十三篇):二叉树的基本概念满二叉树完全二叉树二叉树性质二叉搜索树二叉树定义二叉树的广度优先遍历