欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二叉搜索树与双向链表

程序员文章站 2022-05-06 21:42:17
...

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

思路,因为时二叉搜索数,所以使用中序遍历正好可以得到有序的序列,因为只能调整指针指向,所以规定将
所有右指针,变成链表的正向指针。
所有左指针,变成链表的逆向指针。

二叉搜索树与双向链表

public class Solution {
  
  //递归函数的作用是得到一个数转成序列的之后的最后一个节点,这样就可以先得到左子树序列的最后一个节点,
  //加上当前根节点,在加上右子树的序列,就可以得到一个完整的序列
    public TreeNode middfs(TreeNode nownode,TreeNode lastnode){
        if (nownode==null)
            return null;
        if (nownode.left!=null)
            lastnode=middfs(nownode.left,lastnode);//第一步先得到左子树序列的最后一个节点
            
            //将当前节点加入序列
        if(lastnode!=null)//特判第一个节点,否则会出现空指针,因为null没有right
            lastnode.right=nownode;
        nownode.left=lastnode;
        lastnode=nownode;//更新序列的最后一个节点
        
        if (nownode.right!=null)
            lastnode=middfs(nownode.right,lastnode);//得到整体的序列的最后一个节点
        return lastnode;
    }

    public TreeNode Convert(TreeNode pRootOfTree) {

        TreeNode ans;
        TreeNode lastnode=null;
        ans=middfs(pRootOfTree,lastnode);
        while (ans!=null&&ans.left!=null)//因为此时ans为最后一个节点,所以还要往前移动到头结点。
            ans= ans.left;

        return ans;
    }
相关标签: 公司笔试 Java