二叉树展开成链表题目描述:给你二叉树的根节点root,请展开成单链表:展开后的单链表也应该用TreeNode,其中右子指针指向链表中的下一个节点,左子指针永远为null。展开后的单向链表应该和二叉树的前序遍历顺序一致。例子见LeetCode官网。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode所有。商业转载请联系官方授权,非商业转载请注明出处。解决方案一:递归使用递归来解决问题。递归过程如下:如果当前根节点为null,直接返回;如果左子树为空,则只需要递归处理当前根节点的右子树;如果当前根节点的右子树为空,则需要递归处理当前根节点的左子树,然后递归处理左子节点指向null,右子节点指向处理后的左子树;如果当前根节点的左右子树都为空,分别递归处理当前根节点的左右子树,然后将根节点的左子节点指向null,右子节点指向处理后的左子树,然后将左子树的最后一个节点指向处理后的右子树。导入com.kaesar.leetcode.TreeNode;publicclassLeetCode_114{/***Recursion**@paramroot*/publicstaticvoidflatten(TreeNoderoot){//当当前根节点为null时,直接返回if(root==null){return;}//当当前根节点的左右子节点都为空时,不需要调整,直接返回if(root.left==null&&root.right==null){return;}if(root.left==null){//当前根节点的左子树为空,则只需要递归处理当前根节点的右子树flatten(root.right);返回;}if(root.right==null){//当当前根节点的右子树为空时,需要递归处理当前根节点的左子树,然后指向当前根节点的左子节点根节点为null,右子节点指向处理后的左子树TreeNodeleft=root.left;展平(左);root.right=左;root.left=null;返回;}//如果当前根节点的左右子树都为空TreeNodeleft=root.left;//递归处理左子树,找到最后处理的节点flatten(left);树节点leftLast=left;while(leftLast.right!=null){leftLast=leftLast.right;}TreeNoderight=root.right;//递归处理右子树flatten(right);//最后将根节点的左子节点指向null,将右子节点指向处理后的左子树,再将左子树的最后一个节点指向处理后的右子树root.right=left;leftLast.right=右;root.left=null;}publicstaticvoidmain(String[]args){TreeNoderoot=newTreeNode(1);root.left=newTreeNode(2);root.right=newTreeNode(5);root.left.left=newTreeNode(3);root.left.right=newTreeNode(4);root.right.right=newTreeNode(6);System.out.println("展开成链表之前");根打印();System.out.println("展开成链表后");压平(根);根打印();}}【每日留言】我们的人生就像过山车,充满了跌宕起伏和刺激。我们经历了很多,要坚强心理,开阔眼界,扩大胸怀
