872. 叶子相似的树

你的名字 2023-10-05 21:09 108阅读 0赞

请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列

3b1bb158ebe9c3147e974f1fae08048e.png

举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。

如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。

如果给定的两个头结点分别为 root1root2 的树是叶相似的,则返回 true;否则返回 false

示例 1:

987b3a71579326526e70439d1a28470c.png

  1. 输入:root1 = [3,5,1,6,2,9,8,null,null,7,4], root2 = [3,5,1,6,7,4,2,null,null,null,null,null,null,9,8]
  2. 输出:true

示例 2:

  1. 输入:root1 = [1], root2 = [1]
  2. 输出:true

示例 3:

  1. 输入:root1 = [1], root2 = [2]
  2. 输出:false

示例 4:

  1. 输入:root1 = [1,2], root2 = [2,2]
  2. 输出:true

示例 5:

57d48edb37912116d948fad8f5a26be3.png

  1. 输入:root1 = [1,2,3], root2 = [1,3,2]
  2. 输出:false

提示:

  • 给定的两棵树可能会有 1200 个结点。
  • 给定的两棵树上的值介于 0200 之间。

    package Solution872;

    import java.util.Stack;

    public class Solution {

    1. public boolean leafSimilar(TreeNode root1, TreeNode root2) {
    2. // Create empty stacks. These stacks are going
    3. // to be used for iterative traversals.
    4. Stack<TreeNode> s1 = new Stack<TreeNode>();
    5. Stack<TreeNode> s2 = new Stack<TreeNode>();
    6. s1.push(root1);
    7. s2.push(root2);
    8. // Loop until either of two stacks is not empty
    9. while (!s1.empty() || !s2.empty()) {
    10. // If one of the stacks is empty means other
    11. // stack has extra leaves so return false
    12. if (s1.empty() || s2.empty())
    13. return false;
    14. TreeNode temp1 = s1.pop();
    15. while (temp1 != null && !(temp1.left == null && temp1.right == null)) {
    16. // Push right and left children of temp1.
    17. // Note that right child is inserted
    18. // before left
    19. if (temp1.right != null)
    20. s1.push(temp1.right);
    21. if (temp1.left != null)
    22. s1.push(temp1.left);
    23. temp1 = s1.pop();
    24. }
    25. // same for tree2
    26. TreeNode temp2 = s2.pop();
    27. while (temp2 != null && !(temp2.left == null && temp2.right == null)) {
    28. if (temp2.right != null)
    29. s2.push(temp2.right);
    30. if (temp2.left != null)
    31. s2.push(temp2.left);
    32. temp2 = s2.pop();
    33. }
    34. // If one is null and other is not, then
    35. // return false
    36. if (temp1 == null && temp2 != null)
    37. return false;
    38. if (temp1 != null && temp2 == null)
    39. return false;
    40. // If both are not null and data is not
    41. // same return false
    42. if (temp1 != null && temp2 != null) {
    43. if (temp1.val != temp2.val)
    44. return false;
    45. }
    46. }
    47. // If control reaches this point, all leaves
    48. // are matched
    49. return true;
    50. }
    51. static void inorder(TreeNode node) {
    52. if (node == null)
    53. return;
    54. /* first recur on left child */
    55. inorder(node.left);
    56. /* then print the data of node */
    57. System.out.printf("%d ", node.val);
    58. /* now recur on right child */
    59. inorder(node.right);
    60. }
    61. public static void main(String[] args) {
    62. // Let us create trees in above example 1
    63. Solution sol = new Solution();
    64. TreeNode root1 = new TreeNode(1);
    65. root1.left = new TreeNode(2);
    66. root1.right = new TreeNode(3);
    67. root1.left.left = new TreeNode(4);
    68. root1.right.left = new TreeNode(6);
    69. root1.right.right = new TreeNode(7);
    70. TreeNode root2 = new TreeNode(0);
    71. root2.left = new TreeNode(1);
    72. root2.right = new TreeNode(5);
    73. root2.left.right = new TreeNode(4);
    74. root2.right.left = new TreeNode(6);
    75. root2.right.right = new TreeNode(7);
    76. if (sol.leafSimilar(root1, root2))
    77. System.out.println("Same");
    78. else
    79. System.out.println("Not Same");
    80. }

    }

发表评论

表情:
评论列表 (有 0 条评论,108人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode 872. 叶子相似

    请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。 ![tree.png][] 举个例子,如上图所示,给定一颗叶值序列为 `(6, 7,