Java 的 ArrayDeque 的 API 介绍,递归和迭代实现二叉树前序、中序、后序遍历,求解《965. 单值二叉树》

Java · ArrayDeque

双端队列 的数组实现

基本

双端队列

添加元素

删除元素

获取元素

迭代器

例题

965. 单值二叉树

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
示例1:
输入:[1,1,1,1,1,null,1]
输出:true
提示:
给定树的节点数范围是 [1, 100]。
每个节点的值都是整数,范围为 [0, 99]

答案

递归 · 前序遍历
var isUnivalTree = function(root) { // 递归 · 前序遍历
  const v = root.val
  const d = n => {
    if (n === null) return true
    if (n.val !== v) return false
    return d(n.left) && d(n.right) 
  }
  return d(root)
};
递归 · 中序遍历
function isUnivalTree(root: TreeNode | null): boolean { // 递归 · 中序遍历
  const v = root.val
  const d = n => {
    if (n === null) return true
    if (d(n.left) === false) return false
    if (n.val !== v) return false
    if (d(n.right) === false) return false
    return true
  }
  return d(root)
};
递归 · 后序遍历
class Solution {
  private $v;
  function isUnivalTree($root) { // 递归 · 后序遍历
    $this->v = $root->val;
    return $this->d($root);
  }
  function d($n) {
    if ($n === null) return true;
    if ($this->d($n->left) === false) return false;
    if ($this->d($n->right) === false) return false;
    if ($this->v !== $n->val) return false;
    return true;
  }
}
迭代 · 单栈 · 前序遍历
func isUnivalTree(root *TreeNode) bool { // 迭代 · 前序遍历
  stack := []*TreeNode{root}
  for len(stack) > 0 {
    n := stack[len(stack) - 1]
    if n.Val != root.Val {
      return false
    }
    stack = stack[:len(stack) - 1]
    if n.Right != nil {
      stack = append(stack, n.Right)
    }
    if n.Left != nil {
      stack = append(stack, n.Left)
    }
  }
  return true
}
迭代 · 单栈 · 中序遍历
class Solution {
  public boolean isUnivalTree(TreeNode root) { // 迭代 · 单栈 · 中序遍历
    Deque<TreeNode> stack = new ArrayDeque<TreeNode>();
    TreeNode p = root;
    while (p != null || stack.size() > 0) {
      while (p != null) {
        stack.push(p);
        p = p.left;
      }
      TreeNode n = stack.pop();
      if (n.val != root.val) return false;
      p = n.right;
    }
    return true;
  }
}
迭代 · 莫里斯 · 中序遍历
class Solution:
  def isUnivalTree(self, root: TreeNode) -> bool: # 迭代 · 莫里斯 Morris · 中序遍历
    v = root.val
    while root:
      if root.left:
        p = root.left
        while p.right and p.right != root: p = p.right
        if p.right == None:
          p.right = root
          root = root.left
        else:
          if root.val != v: return False
          p.right = None
          root = root.right
      else:
        if root.val != v: return False
        root = root.right
    return True
迭代 · 单栈 · 后序遍历
class Solution(object):
  def isUnivalTree(self, root): # 迭代 · 单栈 · 后序遍历
    stack, p, prev = [], root, None
    while p or len(stack):
      while p:
        stack.append(p)
        p = p.left
      n = stack.pop()
      if n.right == None or n.right == prev:
        if n.val != root.val: return False
        prev = n
      else:
        stack.append(n)
        p = n.right
    return True
迭代 · 双栈 · 后序遍历
class Solution {
  public boolean isUnivalTree(TreeNode root) { // 迭代 · 双栈 · 后序遍历
    Deque<TreeNode> stack = new ArrayDeque<TreeNode>();
    Deque<TreeNode> outStack = new ArrayDeque<TreeNode>();
    stack.push(root);
    while (stack.isEmpty() == false) {
      TreeNode n = stack.pop();
      outStack.push(n);
      if (n.left != null) stack.push(n.left);
      if (n.right != null) stack.push(n.right);
    }
    while (outStack.isEmpty() == false) {
      TreeNode n = outStack.pop();
      if (n.val != root.val) return false;
    }
    return true;
  }
}
广度优先搜索(层序),深度优先搜索(前序(递归、迭代)、中序(递归、迭代、莫里斯)、后序(递归、迭代))遍历:求解《404. 左叶子之和》
广度优先搜索(层序),深度优先搜索(前序(递归、迭代)、中序(递归、迭代、莫里斯)、后序(递归、迭代))遍历,求解《404. 左叶子之和》
广度优先搜索(层序),深度优先搜索(前序(递归、迭代)、中序(递归、迭代、莫里斯)、后序(递归、迭代))遍历树深度:求解《104. 二叉树的最大深度》
广度优先搜索(层序),深度优先搜索(前序(递归、迭代)、中序(递归、迭代、莫里斯)、后序(递归、迭代))遍历树深度:求解《104. 二叉树的最大深度》
广度优先搜索(层序),深度优先搜索(前序(递归、迭代)、中序(递归、迭代、莫里斯)、后序(递归、迭代))遍历树深度:求解《513. 找树左下角的值》
广度优先搜索(层序),深度优先搜索(前序(递归、迭代)、中序(递归、迭代、莫里斯)、后序(递归、迭代))遍历树深度,求解《513. 找树左下角的值》