二叉搜索树与双向链表

来源:互联网 发布:程序员群头像 编辑:程序博客网 时间:2024/06/06 17:05

题目描述:

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


问题分析:

在二叉树中,每个节点都有两个指向子节点的指针;同样,在双向链表中,每个节点也有两个指针。这两种数据结构相似,是有可能实现二叉搜索树与双向链表的转化的。

在搜索二叉树中,左子节点总是小于父节点的,右子节点总是大于父节点的,因此在转换的时候,原先指向左子节点的指针调整为链表中指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点指针。所以,我们就有了解题思路。

把根节点与左右子树分开,找到左子树最大的节点pleft,pleft.right指向根节点root,root.left指向pleft;找到右子树最小的节点pright,pright.left指向root,root.right指向pright;然后左子树与右子树的处理方法与上面一样,对其进行递归。


参考代码如下:

/**public class TreeNode {    int val = 0;    TreeNode left = null;    TreeNode right = null;    public TreeNode(int val) {        this.val = val;    }}*/public class TreeNodeConvertList {    public TreeNode Convert(TreeNode pRootOfTree) {        if(pRootOfTree==null)            return null;        pRootOfTree=ConvertTreeNode(pRootOfTree);        while( pRootOfTree.left!=null)            pRootOfTree=pRootOfTree.left;        return pRootOfTree;    }        public TreeNode ConvertTreeNode(TreeNode root){        if(root==null)            return null;        if(root.left!=null){            TreeNode left=ConvertTreeNode(root.left);            //找到左子树中最大的节点,然后与root根节点连接            while(left.right!=null)                left=left.right;            left.right=root;            root.left=left;        }        if(root.right!=null){            TreeNode right=ConvertTreeNode(root.right);            //找到右子树中最小的节点,然后与root根节点连接            while(right.left!=null)                right=right.left;            right.left=root;            root.right=right;                    }        return root;    }    }