LeetCode刷题——二叉树展开为链表#114#Medium

二叉树展开为链表题目的思路探讨与源码
    二叉树展开为链表的题目如下图,该题属于树结构和深度优先搜索类型的题目,主要考察对于树本身结构以及遍历的理解和认识。本文的题目作者想到2种方法,第一种方法是寻找前驱节点法,第二种方法是前序遍历方法。其中第一种方法使用java写、第二种方法使用Python写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
在这里插入图片描述
    本人认为该题目可以使用前驱寻找法和前序遍历方法,首先来说前驱寻找法。当树不为空的时候,开始遍历,首先访问树的左子节点判断是否为空,如果是空则直接将右节点赋予给当前节点;而如果不为空,则将左子节点记录,并判断当前左子节点的右子节点是否为空,如果不为空则继续搜索右子节点的右子节点,以此类推。并且最终将左子节点的值赋给新的节点的右子节点,并且将新的节点的左子节点赋值为空,按这个方法循环遍历,直到前序结果被遍历完毕,那么按照这个思路我们的代码如下:

#喷火龙与水箭龟
class Solution {
    public void flatten(TreeNode root) {
        TreeNode vex=root;
        while(vex !=null) {
            if (vex.left !=null) {
                TreeNode son=vex.left;
                TreeNode father=son;
                while (father.right !=null) {
                    father=father.right;
                }
                father.right=vex.right;
                vex.right=son;
                vex.left=null;
            }
            vex=vex.right;
        }
    }
}

在这里插入图片描述
    显然,我们还可以使用前序遍历搜索的方法来进行解决,首先定义一个方法,就是当节点不为空的时候,可以节点插入到候选列表里,并且把节点的左子节点和右子节点再次调用当前方法。使用这个方法遍历整个树后,得到一个候选列表结果,并记录它的长度,然后遍历这个列表,把每个列表的值前一个值进行记录,将空值赋给前一个值的左子节点,当前值赋给前一个值的右子节点,直到循环结束。所以根据这个思路就可以写出代码,下面是Python代码部分:

#喷火龙与水箭龟
class Solution:
    def flatten(self, root: TreeNode) -> None:
        preList=[]
        def buildSonTree(node):
            if(node):
                preList.append(node)
                buildSonTree(node.left)
                buildSonTree(node.right)
        buildSonTree(root)
        preLen = len(preList)
        for jr in range(1,preLen):
            vex=preList[jr-1]
            flag=preList[jr]
            vex.left=None
            vex.right=flag

在这里插入图片描述
    从结果来说java版本的迭代方法还不错,python版本的递归算法速度也还不错,应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。

Guess you like

Origin blog.csdn.net/qq_26727101/article/details/117853429