问题描述: 将一棵二叉搜索树转成一条排序好的双向链表。要求不能创建新结点。
解法与分析:
- 由于左子树<根结点<右子树,所以双向链表的头结点是二叉搜索树左子树中的最后一个左结点,双向链表的头结点是二叉搜索树右子树中的最后一个右结点,根结点则是链表的中间结点。
- 将树结点中指向左孩子的指针作为双向链表中的前驱指针,指向右孩子的指针作为双向链表指向后继结点的指针。
- 按照上面分析,可以使用树的中序遍历来转换双向链表。这里我们使用递归的方式来实现中序遍历+双向链表转换。
参考代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| * 树节点 */ static class TreeNode { int val; TreeNode left; TreeNode right;
public TreeNode(int val) { this.val = val; }
public TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } }
* 解法:中序遍历的顺序,中间增加连接节点的操作。 * @param root * @return */ public static TreeNode doBST2BWL(TreeNode root) { if(root==null) { return null; } TreeNode head=root; TreeNode left = doBST2BWL(root.left); if(left!=null) { head=left; for(;left.right!=null;left=left.right); left.right=root; } root.left=left; TreeNode right= doBST2BWL(root.right); if(right!=null) { right.left=root; } root.right=right; return head; }
|