• lintcode:在二叉查找树中插入节点


    题目:

     在二叉查找树中插入节点

    给定一棵二叉查找树和一个新的树节点,将节点插入到树中。

    你需要保证该树仍然是一棵二叉查找树。

     样例

    给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的:

     

    挑战

    能否不使用递归?

    解题:

    递归的方法比较简单

    Java程序:

    /**
     * Definition of TreeNode:
     * public class TreeNode {
     *     public int val;
     *     public TreeNode left, right;
     *     public TreeNode(int val) {
     *         this.val = val;
     *         this.left = this.right = null;
     *     }
     * }
     */
    public class Solution {
        /**
         * @param root: The root of the binary search tree.
         * @param node: insert this node into the binary search tree
         * @return: The root of the new binary search tree.
         */
        public TreeNode insertNode(TreeNode root, TreeNode node) {
            // write your code here
            if(root==null)
                return node;
            if(root.val>=node.val)
                root.left = insertNode(root.left,node);
            if(root.val<node.val)
                root.right = insertNode(root.right,node);
            return root;
        }
    }
    View Code

    总耗时: 1636 ms

    非递归的感觉比较复杂。。。。

    一直非递归的方法,就是一直走,一直走,走到没有路的时候就是插入的节点,这里是因为插入的节点一定是在新建的叶子节点,原理是二叉查找树是;1,根节点左子树的值比根节点小,右子树的值都比根节点大,2.左右子树也满足1的条件

    下面程序定义的slow指针是用来做最后插入节点的父节点的

    /**
     * Definition of TreeNode:
     * public class TreeNode {
     *     public int val;
     *     public TreeNode left, right;
     *     public TreeNode(int val) {
     *         this.val = val;
     *         this.left = this.right = null;
     *     }
     * }
     */
    public class Solution {
        /**
         * @param root: The root of the binary search tree.
         * @param node: insert this node into the binary search tree
         * @return: The root of the new binary search tree.
         */
        public TreeNode insertNode(TreeNode root, TreeNode node) {
            // write your code here
            if(root==null){
                 root=node;
                 return root;
            }
            TreeNode fast = root;
            TreeNode slow = null;
            while(fast!=null){// fast == null 的时候 slow就是其父结点,而这个空的就是要插入的结点位置
                slow = fast;
                if(fast.val>node.val){
                    fast = fast.left;
                }else{
                    fast = fast.right;
                }
            }
            if(slow!=null){
                if(slow.val>node.val){
                    slow.left = node;
                }else{
                    slow.right = node;
                }
            }
            return root;
        }
    }

    总耗时: 1753 ms

    Python程序:

    """
    Definition of TreeNode:
    class TreeNode:
        def __init__(self, val):
            self.val = val
            self.left, self.right = None, None
    """
    class Solution:
        """
        @param root: The root of the binary search tree.
        @param node: insert this node into the binary search tree.
        @return: The root of the new binary search tree.
        """
        def insertNode(self, root, node):
            # write your code here
            if root==None:
                return node
            if root.val>=node.val:
                root.left = self.insertNode(root.left,node)
            if root.val<node.val:
                root.right = self.insertNode(root.right,node)
            return root
            
    View Code

    总耗时: 272 ms

    非递归程序:

    """
    Definition of TreeNode:
    class TreeNode:
        def __init__(self, val):
            self.val = val
            self.left, self.right = None, None
    """
    class Solution:
        """
        @param root: The root of the binary search tree.
        @param node: insert this node into the binary search tree.
        @return: The root of the new binary search tree.
        """
        def insertNode(self, root, node):
            # write your code here
            cur = root
            last = None
            if root==None:
                return node
            while cur!=None:
                last = cur
                if cur.val>node.val:
                    cur = cur.left
                elif cur.val<=node.val:
                    cur = cur.right
            if last!=None:
                if last.val>node.val:
                    last.left = node
                else:
                    last.right = node
            return root
    View Code
  • 相关阅读:
    Java实现荷兰国旗问题
    Java实现荷兰国旗问题
    QTcpSocket 对连接服务器中断的不同情况进行判定(六种情况,其中一种使用IsNetworkAlive API方法)
    怀旧老游戏
    我的第一个Chrome插件:天气预报应用
    ddd
    Android 反编译工具
    ASP.NET MVC局部视图
    jQuery类库的设计
    jquery+html三级联动下拉框
  • 原文地址:https://www.cnblogs.com/bbbblog/p/4872243.html
Copyright © 2020-2023  润新知