Java/897. Increasing Order Search Tree 递增顺序查找树

60 篇文章 0 订阅
45 篇文章 0 订阅

题目


 

代码部分(70ms)

class Solution {
    List<Integer> list = new ArrayList();
    public TreeNode increasingBST(TreeNode root) {
        if(root == null)
            return root;
        changeList(root);
        int len = list.size();
        TreeNode newT = new TreeNode(list.get(0));
        createTree(newT, 1, len);
        return newT;
        
    }
    public void changeList(TreeNode root){
        if(root.left != null)
            changeList(root.left);
        list.add(root.val);
        if(root.right != null)
            changeList(root.right);
    }
    public void createTree(TreeNode root, int n, int len){
        if(n >= len)
            return;
        TreeNode node = new TreeNode(list.get(n));
        n++;
        root.right = node;
        createTree(root.right, n, len);
    }
}

 

  1. 若树为空,返回空树,

  2. 调用 changeList() 将树转换为 list (原理:中序遍历树的过程,将值存入 list ),可得到我们想要的顺序

  3. 按顺序将 list 创建为一个我们想要的树

  4. 返回该树。

 

代码部分二(47ms)

class Solution {
    public TreeNode increasingBST(TreeNode root) {
        TreeNode node = new TreeNode(0);
        tsp(root,node);
        return node.right;
    }
    public TreeNode tsp(TreeNode root, TreeNode cur){
        if(root == null)
            return cur;
        cur = tsp(root.left, cur);
        cur.right = new TreeNode(root.val);
        cur = cur.right;
        return tsp(root.right, cur);
    }
}
  1. 创建新树的首节点

  2. 调用 tsp()

  3. 若当前节点为空,返回新树的当前节点

  4. 先遍历到最左边的节点(最小的节点),将左节点作为第一个,node.right=根节点,node.right.right = 右节点(若存在)

  5. 不断按左中右的顺序遍历树,并将值赋予新树

  6. 返回 node.right(第一个节点是我们创建的额外节点)

 

代码部分三(一改进,35ms)

class Solution {
    List<Integer> list = new ArrayList();
    public TreeNode increasingBST(TreeNode root) {
        dfs(root);
        TreeNode res = new TreeNode(0);
        TreeNode cur = res;
        for (int node: list) {
            cur.right = new TreeNode(node);
            cur = cur.right;
        }
        return res.right;

    }
    public void dfs(TreeNode node){
        if(node == null)
            return;
        dfs(node.left);
        list.add(node.val);
        dfs(node.right);
    }
}
  1. 调用 dfs() ,中序遍历树并将节点值存入 list

  2. 新建两个节点 res 、cur

  3. 遍历 list ,通过 node 值创建节点,并将其链接到当前节点的右节点,最后将指向当前节点的cur 移到最新节点

  4. 返回 res.right

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值