最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java二叉樹的數據插入算法介紹

 更新時間:2021年12月20日 15:09:45   作者:Code丨Monkey  
大家好,本篇文章主要講的是java二叉樹的數據插入算法介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽

例題:

leetcode 第701題

二叉樹插入數據

題目:

給定二叉搜索樹(BST)的根節(jié)點和要插入樹中的值,將值插入二叉搜索樹。 返回插入后二叉搜索樹的根節(jié)點。 輸入數據 保證 ,新值和原始二叉搜索樹中的任意節(jié)點值都不同。

對于二叉樹的遍歷有三種方式

前序遍歷:根左右 的順序
中序遍歷:左根右 的順序
后序遍歷:左右根 的順序

二叉樹插入數據的原理/思路是什么?

二叉樹的左側的數會比右側的數小,所以我們用需要插入的數據和根節(jié)點的值比較大小,如果插入的數據大于根節(jié)點,那么根節(jié)點就轉移到右側的節(jié)點上,此時重復上面的操作即可完成插入。

我們讀一下TreeNode代碼段:

class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
}

很顯然,二叉樹之間是通過left,right來鏈接的,和ListNode的next非常的相似,只不過二叉樹是雙向鏈接,而鏈表則是單向。所以我們就需要獲取到父節(jié)點,用父節(jié)點的leftright來鏈接插入的數。

那么我們如何獲取到能正確插入該數據的節(jié)點呢?

1.我們可以通過循環(huán)移動節(jié)點的方式,來獲取最后一個不為空的節(jié)點

 //定義一個父級二叉樹 用來記錄上個操作的節(jié)點
        TreeNode parent =root,cur=root;
        while(cur!=null){
            //如果p部位空的話,就和val比較來進行節(jié)點的移動
            parent = cur; //記錄上一個節(jié)點,用于最后的鏈接
            cur = cur.val<val?cur.right:cur.left;//節(jié)點進行移動。
        }

2.然后用最后一個不為空的節(jié)點的值與插入值進行比較插入即可,小的則插入左側,大的則插入右側。

代碼實現

if(parent.val>val){
            //如果父級的val是大于輸入的val,那么插在左邊
            parent.left = new TreeNode(val);
        }else{
            //否則插在右邊
            parent.right = new TreeNode(val);
        }

整體代碼

 if (root == null){
            return new TreeNode(val);
        }
        //定義一個父級二叉樹 用來記錄上個操作的節(jié)點
        TreeNode parent =root,cur=root;
        while(cur!=null){
            //如果p部位空的話,就和val比較來進行節(jié)點的移動
            parent = cur; //記錄上一個節(jié)點,用于最后的鏈接
            cur = cur.val<val?cur.right:cur.left;//節(jié)點進行移動。
        }
        if(parent.val>val){
            //如果父級的val是大于輸入的val,那么插在左邊
            parent.left = new TreeNode(val);
        }else{
            //否則插在右邊
            parent.right = new TreeNode(val);
        }
        return root;

當然,因為節(jié)點的移動一直重復一個操作,我們可以用更簡單的遞歸實現

 public TreeNode insertIntoBST(TreeNode root, int val) {
          if (root == null){
            return new TreeNode(val);
          }
          if(root.val<val){
              //因為父節(jié)點的值小于插入值,則要進行節(jié)點的右移
              root.right = insertIntoBST(root.right,val);
          }else{
              root.left = insertIntoBST(root.left,val);
          }
        return root;
    }

全部代碼

package JAVA算法.LeetCode;

public class t701 {
    /**
    701. 二叉搜索樹中的插入操作
    二叉樹分為前序插入,中序插入,后序插入
    解決思路 1.利用迭代思想實現二叉樹的插入
     */

}


class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
}

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */


class Solution {
    /*
        二叉樹插入原理:
        1.前序插入(根左右) 如果插入的樹大于根,數則往右側移動,與右側分支的根進行比較,然后重復前面的操作
        */
    public TreeNode insertIntoBST(TreeNode root, int val) {
        //當傳入的根節(jié)點為空,則將傳入的值設置為節(jié)點
        if (root == null){
            //如果tree為空的,那么就創(chuàng)建一個新的二叉并賦值
            return new TreeNode(val);
        }

        if (root.val<val){
            //當當前的值是大于左側的值,則往右側移動
            root.right=insertIntoBST(root.right,val);
        }else{
            //反之
            root.left=insertIntoBST(root.left,val);
        }
        return root;
    }


    //解法2:循環(huán)判斷
    public TreeNode insertIntoBST2(TreeNode root, int val) {
        if (root == null){
            return new TreeNode(val);
        }
        TreeNode parent=root,p=root;
        while(true){
            if (p!=null){
                parent = p; //記錄上個節(jié)點
                p = p.val>val?p.left:p.right;
            }else{
                //當p為null了,則已經找到位置了,現在則需要將值進行插入
                if (parent.val>val){
                    parent.left = new TreeNode(val);
                }else{
                    parent.right = new TreeNode(val);
                }
                break;
            }

        }
        return root;
    }
    //解法三:循環(huán)遍歷,

    /**
     *
     * @param root
     * @param val
     * @return
     *
     * 解法思路:我們先通過一個循環(huán)找到能插入位置的父節(jié)點,
     * 然后我們就對值與父節(jié)點的值進行比較,如果該值小于父節(jié)點的話我們就插入在父節(jié)點的左側
     */
    public TreeNode insertBST3(TreeNode root,int val){
        if (root == null){
            return new TreeNode(val);
        }
        //定義一個父級二叉樹 用來記錄上個操作的節(jié)點
        TreeNode parent =root,p=root;
        while(p!=null){
            //如果p部位空的話,就和val比較來進行節(jié)點的移動
            parent = p; //記錄上一個節(jié)點,用于最后的鏈接
            p = p.val<val?p.right:p.left;//節(jié)點進行移動。
        }
        if(parent.val>val){
            //如果父級的val是大于輸入的val,那么插在左邊
            parent.left = new TreeNode(val);
        }else{
            //否則插在右邊
            parent.right = new TreeNode(val);
        }

        return root;
    }


}


到此這篇關于java二叉樹的數據插入算法介紹的文章就介紹到這了,更多相關java二叉樹內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • j2ee mybatis注解@Data,@TableName,@TableField使用方式

    j2ee mybatis注解@Data,@TableName,@TableField使用方式

    這篇文章主要介紹了j2ee mybatis注解@Data,@TableName,@TableField使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • DecimalFormat數字格式化用法詳解

    DecimalFormat數字格式化用法詳解

    這篇文章主要為大家詳細介紹了DecimalFormat數字格式化用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 舉例講解Java的Spring框架中AOP程序設計方式的使用

    舉例講解Java的Spring框架中AOP程序設計方式的使用

    這篇文章主要介紹了Java的Spring框架中AOP程序設計方式的使用講解,文中舉的AOP下拋出異常的例子非常實用,需要的朋友可以參考下
    2016-04-04
  • 利用Java+MySQL實現附近功能實例

    利用Java+MySQL實現附近功能實例

    現在很多手機軟件都用附近搜索功能,但具體是怎么實現的呢?下面這篇文章就來給大家介紹關于利用Java+MySQL實現附近功能的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • 使用@Transactional 設置嵌套事務不回滾

    使用@Transactional 設置嵌套事務不回滾

    這篇文章主要介紹了使用@Transactional 設置嵌套事務不回滾問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中ArrayList的常見用法示例小結

    Java中ArrayList的常見用法示例小結

    本文介紹了Java的ArrayList,它是一個動態(tài)數組,可以自動調整大小,支持添加、刪除、獲取元素等操作,同時,還討論了如何存儲基本數據類型以及在多線程環(huán)境下的使用注意事項,感興趣的朋友一起看看吧
    2025-02-02
  • Java BigDecimal類的使用和注意事項

    Java BigDecimal類的使用和注意事項

    這篇文章主要講解Java中BigDecimal類的用法,并簡單介紹一些注意事項,希望能給大家做一個參考。
    2016-06-06
  • javafx實現五子棋游戲

    javafx實現五子棋游戲

    這篇文章主要為大家詳細介紹了javafx實現五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 一個簡單JDK版動態(tài)代理

    一個簡單JDK版動態(tài)代理

    這篇文章主要為大家詳細介紹了一個簡單JDK版動態(tài)代理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Spring MVC創(chuàng)建項目踩過的bug

    Spring MVC創(chuàng)建項目踩過的bug

    這篇文章主要介紹了Spring MVC創(chuàng)建項目踩過的bug,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11

最新評論

乾安县| 柏乡县| 高清| 崇阳县| 临夏县| 乐清市| 阳新县| 昭平县| 南澳县| 安吉县| 石家庄市| 青阳县| 常山县| 安新县| 买车| 绥阳县| 攀枝花市| 屯昌县| 惠安县| 阳曲县| 保康县| 呼和浩特市| 黄石市| 隆化县| 北海市| 兴安盟| 中江县| 安阳县| 中宁县| 上饶县| 芮城县| 庆云县| 布尔津县| 察雅县| 铅山县| 潼关县| 和平县| 建平县| 上蔡县| 宜良县| 休宁县|