输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整树中结点指针的指向。
论差距有多大。
by bigGold:
链接:https://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5 来源:牛客网 解题思路: 1.将左子树构造成双链表,并返回链表头节点。 2.定位至左子树双链表最后一个节点。 3.如果左子树链表不为空的话,将当前root追加到左子树链表。 4.将右子树构造成双链表,并返回链表头节点。 5.如果右子树链表不为空的话,将该链表追加到root节点之后。 6.根据左子树链表是否为空确定返回的节点。 public TreeNode Convert(TreeNode root) { if(root==null) return null; if(root.left==null&&root.right==null) return root; // 1.将左子树构造成双链表,并返回链表头节点 TreeNode left = Convert(root.left); TreeNode p = left; // 2.定位至左子树双链表最后一个节点 while(p!=null&&p.right!=null){ p = p.right; } // 3.如果左子树链表不为空的话,将当前root追加到左子树链表 if(left!=null){ p.right = root; root.left = p; } // 4.将右子树构造成双链表,并返回链表头节点 TreeNode right = Convert(root.right); // 5.如果右子树链表不为空的话,将该链表追加到root节点之后 if(right!=null){ right.left = root; root.right = right; } return left!=null?left:root; }
by myself:
class TreeNode21 { int val = 0; TreeNode21 left = null; TreeNode21 right = null; public TreeNode21(int val) { this.val = val; } } class Solution21 { public TreeNode21 Convert(TreeNode21 pRootOfTree) { if(pRootOfTree==null){ return null; } if(pRootOfTree.left!=null) //将根节点的左边排成双链表的形式,并返回根节点 pRootOfTree = convertDetail(pRootOfTree,pRootOfTree.left); if(pRootOfTree.right!=null) //将根节点的右边排成双链表的形式,并返回根节点 pRootOfTree = convertDetail(pRootOfTree,pRootOfTree.right);//(13,11) while(pRootOfTree.left!=null){ pRootOfTree=pRootOfTree.left; } return pRootOfTree;//返回整个链表的头结点 } private TreeNode21 convertDetail(TreeNode21 parentNode,TreeNode21 node){ //1.(13,10) return 10 if(node.left==null && node.right==null){ if(parentNode.left==node){ node.right=parentNode; return parentNode; } if(parentNode.right==node){ node.left=parentNode; } return parentNode; } if(node.left!=null){ convertDetail(node,node.left); } if(node.right!=null){ convertDetail(node,node.right); } if(parentNode.left==node){ while(node.right!=null){ node=node.right; } parentNode.left=node; node.right=parentNode; } if(parentNode.right==node){ while(node.left!=null){ node=node.left; } parentNode.right=node; node.left=parentNode; } return parentNode; } }