算法系列——二叉搜索树和双向链表(剑指offer)

来源:互联网 发布:索尼手机更新软件 编辑:程序博客网 时间:2024/05/21 17:51

题目描述

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

解题思路

由于二叉树的中序遍历具有可以实现递增的功能,同时二叉树的每一个节点都有两个指针,左指针和右指针,因此我们可以用这些特点将二叉树转换成一个双向链表,每次在递归遍历的时候设置一个pre,记录中序遍历时当前节点的前节点,然后将当前节点的左指针指向pre节点,然后如果pre节点不为空则将pre的右节点指向当前节点,由此就形成了一个双向链表的前后指针。每次递归重复这两步,则可以形成一个完整的双向链表。
最后一步就是双向链表已经构建完成了,而题目要求返回双向链表,则从原二叉树的root节点往前遍历找到双向链表的头返回即可.

注意:代码中设置了一个只有一个空间的数组来保存pre节点。

程序实现

public class Solution {    public TreeNode Convert(TreeNode pRootOfTree) {        if(pRootOfTree==null)            return pRootOfTree;        //结点前驱        TreeNode[] pre=new TreeNode[1];        helper(pRootOfTree,pre);        TreeNode p=pRootOfTree;        while(p.left!=null)            p=p.left;        return p;    }    private void helper(TreeNode node,TreeNode[] pre){        if(node.left!=null)            helper(node.left,pre);        node.left=pre[0];        if(pre[0]!=null)            pre[0].right=node;        pre[0]=node;        if(node.right!=null)            helper(node.right,pre);    }}
阅读全文
0 0
原创粉丝点击