剑指offer 二叉搜索树以及双向链表

来源:互联网 发布:js appendchild的用法 编辑:程序博客网 时间:2024/06/11 18:42

题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

解答:

public class Solution {    public TreeNode Convert(TreeNode pRootOfTree) {        if(pRootOfTree==null)return null;        if(pRootOfTree.left==null&&pRootOfTree.right==null){            return pRootOfTree;        }else if(pRootOfTree.left==null&&pRootOfTree.right!=null){        pRootOfTree.right=Convert(pRootOfTree.right);        pRootOfTree.right.left=pRootOfTree;            return pRootOfTree;        }else if(pRootOfTree.left!=null&&pRootOfTree.right==null){            TreeNode head=null;         TreeNode tail= Convert(pRootOfTree.left);            head=tail;         while(tail.right!=null){            tail=tail.right;         }        pRootOfTree.left=tail;        pRootOfTree.left.right=pRootOfTree;            return head;                    }else{           TreeNode head=null;        TreeNode tail= Convert(pRootOfTree.left);            head=tail;        while(tail.right!=null){            tail=tail.right;        }        pRootOfTree.left=tail;        pRootOfTree.left.right=pRootOfTree;        pRootOfTree.right=Convert(pRootOfTree.right);        pRootOfTree.right.left=pRootOfTree;            return head;        }                }      }
思路:

  使用递归的解法:把函数理解为输入一个二叉树的根,返回一个双向链表的头结点,以左孩子构成的双向链表的尾节点作为根节点左侧相邻的节点,以右孩子构成的双向链表的头节点作为根节点右侧相邻的节点。递归拼接成一条双向链表,并返回双向链表的头结点。

重点:

  重点是递归时注意左右子树为空时候的判断!


原创粉丝点击