zoukankan      html  css  js  c++  java
  • 二叉搜索树+双向链表

    题目来源http://blog.csdn.net/v_JULY_v/article/details/6126406

    二叉搜索树参考:http://blog.csdn.net/lcore/article/details/8889176

    双向链表参考:http://www.cnblogs.com/skywang12345/p/3308807.html

      1 package data.structure.exercise;
      2 
      3 import java.util.LinkedList;
      4 
      5 public class BinaryTree {
      6     
      7     private TreeNode root;
      8     
      9     public BinaryTree(int root){
     10         this.setRoot(new TreeNode(root));
     11     }
     12     
     13     public TreeNode insert(int value){
     14         if(this.getRoot() == null){
     15             return null;
     16         }
     17         return insert(this.getRoot(), value);
     18     }
     19     
     20     private TreeNode insert(TreeNode node, int value){
     21         if(node == null){
     22             node = new TreeNode(value, null, null);
     23             return node;
     24         }
     25         
     26         if(value < node.value){
     27             TreeNode lnode = insert(node.getLnode(), value);
     28             node.setLnode(lnode);
     29         }else{
     30             TreeNode rnode = insert(node.getRnode(), value);
     31             node.setRnode(rnode);
     32         }
     33         
     34         return node;
     35     }
     36 
     37     public boolean find(TreeNode node, int value){
     38         if(node == null){
     39             return false;
     40         }
     41         
     42         if(value == node.value){
     43             return true;
     44         }else if(value < node.value){
     45             return find(node.getLnode(), value);
     46         }else{
     47             return find(node.getRnode(), value);
     48         }
     49         
     50     }
     51     
     52     public TreeNode findMax(TreeNode node) {  
     53         if(node!=null)  {  
     54             while(node.getRnode()!=null)  
     55                 node=node.getRnode();  
     56         }  
     57         return node;         
     58     } 
     59     
     60     public TreeNode remove(int value){
     61         return remove(this.getRoot(), value);
     62     }
     63     private TreeNode remove(TreeNode node, int value){
     64         if(node == null){
     65             return null;
     66         }
     67         
     68         if(value == node.value){
     69             
     70             if(node.getLnode() !=null && node.getRnode() !=null){
     71                 //左子树最大节点的parent
     72                 TreeNode parentOfMax = node.getLnode().getRnode();
     73                 while(parentOfMax.getRnode().getRnode() !=null){
     74                     parentOfMax = parentOfMax.getRnode();
     75                 }
     76                 //左子树最大的节点
     77                 TreeNode maxNode = parentOfMax.getRnode();
     78                 node.setValue(maxNode.getValue());
     79                 node.setRnode(remove(node.getRnode(), maxNode.getValue()));
     80             }
     81             else{
     82                 if(node.getLnode() !=null){
     83 
     84                     node = node.getLnode();
     85                 }else{
     86                     //node.getRnode() != null
     87                     node = node.getRnode();
     88                 }
     89             }
     90             
     91         }else if(value < node.value){
     92             node.setLnode(remove(node.getLnode(), value));
     93         }else{
     94             node.setRnode(remove(node.getRnode(), value));
     95         }
     96         return node;
     97     }
     98 
     99     public LinkedList<TreeNode> tree2LinkedList(){
    100         return tree2LinkedList(this.getRoot());
    101     }
    102     
    103     private LinkedList<TreeNode> tree2LinkedList(TreeNode root){
    104         
    105         LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
    106         
    107         dfs(root, queue);
    108         
    109         return queue;
    110         
    111     }
    112     
    113     private void dfs(TreeNode root, LinkedList<TreeNode> queue){
    114         
    115         if(root!=null){
    116             dfs(root.getLnode(), queue);
    117             queue.addLast(root);
    118             dfs(root.getRnode(), queue);
    119         }
    120     }
    121     
    122     
    123     public TreeNode getRoot() {
    124         return root;
    125     }
    126 
    127     public void setRoot(TreeNode root) {
    128         this.root = root;
    129     }
    130 
    131 
    132     public class TreeNode{
    133         
    134         private int value;
    135         
    136         private TreeNode lnode;
    137         
    138         private TreeNode rnode;
    139         
    140         public TreeNode(int value){
    141             this.value = value;
    142         }
    143         
    144         public TreeNode(int value, TreeNode lnode, TreeNode rnode){
    145             
    146             this.setValue(value);
    147             this.setLnode(lnode);
    148             this.setRnode(rnode);
    149         }
    150 
    151         public int getValue() {
    152             return value;
    153         }
    154 
    155         public void setValue(int value) {
    156             this.value = value;
    157         }
    158 
    159         public TreeNode getLnode() {
    160             return lnode;
    161         }
    162 
    163         public void setLnode(TreeNode lnode) {
    164             this.lnode = lnode;
    165         }
    166 
    167         public TreeNode getRnode() {
    168             return rnode;
    169         }
    170 
    171         public void setRnode(TreeNode rnode) {
    172             this.rnode = rnode;
    173         }
    174 
    175         @Override
    176         public String toString() {
    177             return "TreeNode [value=" + value + ", lnode=" + lnode + ", rnode=" + rnode + "]";
    178         }
    179         
    180     }
    181     
    182     public static void main(String[] args){
    183         BinaryTree tree = new BinaryTree(10);
    184         tree.insert(6);
    185         tree.insert(14);
    186         tree.insert(4);
    187         tree.insert(8);
    188         tree.insert(12);
    189         tree.insert(16);
    190         
    191         System.out.println("root.left: "+ tree.getRoot().getLnode().toString());
    192         System.out.println("root.right: "+ tree.getRoot().getRnode().toString());
    193         tree.remove(16);
    194         System.out.println("root.right: "+tree.getRoot().getRnode().toString());
    195         
    196         LinkedList<TreeNode> treeNodes = tree.tree2LinkedList();
    197         for(TreeNode node:treeNodes){
    198             System.out.println(node);
    199         }
    200     }
    201 }
  • 相关阅读:
    能组成多少个无重复数字且不为5的倍数的五位数有多少个?
    http与https
    观察者模式和发布/订阅模式的区别
    快速排序的最优时间复杂度是 O(nlogn)
    函数实现 composeFunctions(fn1,fn2,fn3,fn4)等价于fn4(fn3(fn2(fn1))
    vue双向绑定代码实现
    node历史版本下载
    阻止scroll冒泡
    中断或取消Promise链的可行方案
    从输入url到页面加载完成发生了什么?——前端角度
  • 原文地址:https://www.cnblogs.com/gui0901/p/6442456.html
Copyright © 2011-2022 走看看