LeetCode 617. 合并二叉树(C#实现)——二叉树,递归,迭代

一、问题

https://leetcode-cn.com/problems/merge-two-binary-trees/

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例 1:

输入: 
    Tree 1                     Tree 2                  
          1                         2                             
         / \                       / \                            
        3   2                     1   3                        
       /                           \   \                      
      5                             4   7                  
输出: 
合并后的树:
         3
        / \
       4   5
      / \   \ 
     5   4   7

注意: 合并必须从两个树的根节点开始。

二、GitHub实现:https://github.com/JonathanZxxxx/LeetCode/blob/master/MergeClass.cs

  Blog:https://www.cnblogs.com/zxxxx/

三、思路

  1、递归:对两棵树进行前序遍历,并将对应的节点合并。将当前节点的值进行相加,并对左右孩子进行递归合并,如果为空,就返回另外一棵树作为结果。

  2、迭代:将两棵树的根节点入栈,栈中的每个元素都存放两个根节点,栈顶为当前需要处理的根节点。在每次迭代中,去除栈顶元素并移出栈,并将他们的值相加;如果两个节点都有左孩子,入栈,如果只有一个节点左孩子有值,将其作为第一个节点的左孩子,如果两个节点的左孩子都为空,不做任何处理;右孩子同理。迭代完成后返回第一棵树作为结果。

四、代码

  1     public class MergeClass
  2     {
  3         /// <summary>
  4         /// 递归
  5         /// </summary>
  6         /// <param name="t1"></param>
  7         /// <param name="t2"></param>
  8         /// <returns></returns>
  9         public TreeNode MergeTrees(TreeNode t1, TreeNode t2)
 10         {
 11             if (t1 == null)
 12             {
 13                 return t2;
 14             }
 15             if (t2 == null)
 16             {
 17                 return t1;
 18             }
 19             t1.val += t2.val;
 20             t1.left = MergeTrees(t1.left, t2.left);
 21             t1.right = MergeTrees(t1.right, t2.right);
 22             return t1;
 23         }
 24 
 25         /// <summary>
 26         /// 栈迭代
 27         /// </summary>
 28         /// <param name="t1"></param>
 29         /// <param name="t2"></param>
 30         /// <returns></returns>
 31         public TreeNode MergeTrees2(TreeNode t1, TreeNode t2)
 32         {
 33             if (t1 == null)
 34             {
 35                 return t2;
 36             }
 37             var stack = new Stack<TreeNode[]>();
 38             stack.Push(new TreeNode[] { t1, t2 });
 39             while (stack.Any())
 40             {
 41                 var pop = stack.Pop();
 42                 if (pop[0] == null || pop[1] == null)
 43                 {
 44                     continue;
 45                 }
 46                 pop[0].val += pop[1].val;
 47                 if (pop[0].left == null)
 48                 {
 49                     pop[0].left = pop[1].left;
 50                 }
 51                 else
 52                 {
 53                     stack.Push(new TreeNode[] { pop[0].left, pop[1].left });
 54                 }
 55                 if (pop[0].right == null)
 56                 {
 57                     pop[0].right = pop[1].right;
 58                 }
 59                 else
 60                 {
 61                     stack.Push(new TreeNode[] { pop[0].right, pop[1].right });
 62                 }
 63             }
 64             return t1;
 65         }
 66 
 67         /// <summary>
 68         /// 队列迭代
 69         /// </summary>
 70         /// <param name="t1"></param>
 71         /// <param name="t2"></param>
 72         /// <returns></returns>
 73         public TreeNode MergeTrees3(TreeNode t1, TreeNode t2)
 74         {
 75             if (t1 == null)
 76             {
 77                 return t2;
 78             }
 79             var queue = new Queue<TreeNode[]>();
 80             queue.Enqueue(new TreeNode[] { t1, t2 });
 81             while (queue.Any())
 82             {
 83                 var current = queue.Dequeue();
 84                 if (current[0] == null || current[1] == null)
 85                 {
 86                     continue;
 87                 }
 88                 current[0].val += current[1].val;
 89                 if (current[0].left == null)
 90                 {
 91                     current[0].left = current[1].left;
 92                 }
 93                 else
 94                 {
 95                     queue.Enqueue(new TreeNode[] { current[0].left, current[1].left });
 96                 }
 97                 if (current[0].right == null)
 98                 {
 99                     current[0].right = current[1].right;
100                 }
101                 else
102                 {
103                     queue.Enqueue(new TreeNode[] { current[0].right, current[1].right });
104                 }
105             }
106             return t1;
107         }
108 
109         public class TreeNode
110         {
111             public int val;
112             public TreeNode left;
113             public TreeNode right;
114             public TreeNode(int x) { val = x; }
115         }
116 
117     }

 

posted @ 2020-01-02 11:22  落花流水Zxxxx  阅读(74)  评论(0编辑  收藏