vlambda博客
学习文章列表

【每日编程-79期】二叉树展开为链表

今日问题:

给定一个二叉树,原地将它展开为链表。

例如,给定二叉树

    1

   / \

  2   5

 / \   \

3   4   6

将其展开为:

1

 \

  2

   \

    3

     \

      4

       \

        5

         \

          6

 

解决方法:

递归图解:

    1                     1                    1

   / \                   /  \                    \

  2   5      ->         2     5   ->              2

 / \   \                 \     \                     \

3   4   6                  3     6                     3

\                           \

                       4                           4

                          \

                           5

\

6

C++代码:



非递归:

从根节点开始遍历

先判断左孩子是否存在

如存在,则将根节点和其右孩子断开,将左孩子及其子树一起连到原右孩子的位置,把原右孩子连到原左孩子最后面的右孩子后面。

非递归图解:

    1                     1                    1

   / \                     \                    \

  2   5      ->             2      ->           2

 / \   \                   /  \                     \

3   4   6                 3    4                      3

\                       \

5                       4

\                        \

6                         5

\

6

C++代码:

【每日编程-79期】二叉树展开为链表


C代码:


Java代码:



明日题目预告:

合并二叉树

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

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

示例 1:

输入:

        Tree 1                     Tree 2                 

          1                         2                            

         / \                       / \                           

        3  2                     1   3                       

       /                           \   \                     

      5                             4   7                 

输出:

合并后的树:

            3

           / \

          4   5

         / \   \

         5  4   7

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

 



更多编程题。

请至首页->每日系列->每日编程