zoukankan      html  css  js  c++  java
  • 二叉树附加删除算法

    public class Tree {
        
        TreeNode last = null;
        TreeNode root = null;
        
        
        public Tree(int value){
            root = createNode(value);
        }
            
        //结构
         static class TreeNode{
             int data;
             TreeNode left;
             TreeNode right; 
         }
         
         //查找结点
         public TreeNode searchTreeNode(int key,TreeNode tree){
             TreeNode keyNode = null;
             if(tree == null){
                 return tree;
             }
             if(tree.data == key){
                 return tree;
             }else if(key < tree.data ){
                 last = tree;
                 keyNode = searchTreeNode(key,tree.left);
             }else if(key > tree.data){
                 last = tree;
                 keyNode = searchTreeNode(key,tree.right);
             }
             return keyNode;
         }
         
         
         //添加节点
         public void addTreeNode(int key){
             if(searchTreeNode(key,root) == null){
                 TreeNode tree = createNode(key);
                 if(key < last.data){
                     last.left = tree;
                 }else if(key > last.data){
                     last.right = tree;
                 }
             }
             last = null;
         }
         
         //遍历
         public void iterate(TreeNode node){
            if(node ==null){
                return;
            }
            System.out.println(node.data);
            iterate(node.left);
            iterate(node.right);
         }
        
         public TreeNode createNode(int key){
            TreeNode tree = new TreeNode();
            tree.data = key;
            return tree;
         }
         
         public void removeNode(int key){
             TreeNode tree = searchTreeNode(key,root);
             if(tree.left == null && tree.right == null){
                 
             }
             //如果右节点为空       当前节点取代左节点
             else if(tree.right == null){
                 tree.data = tree.left.data;        // 把当前的左节点指向需要删除的左节点的左节点
                 tree.right = tree.left.right;        // 把删除节点的右节点指向删除节点的左节点右节点
                 tree.data = tree.left.data;        // SET删除节点的值
             }else if(tree.left  == null){
                 tree.right = tree.right.right;
                 tree.left = tree.right.left;
                 tree.data = tree.right.data;
             }else{
                 //如果左右都不为空
                 //获得右树最小的一个
                 TreeNode nodeRight = tree.right;
                 TreeNode lastLeftParent = null;
                 while(nodeRight.left != null){
                     lastLeftParent = nodeRight;
                     nodeRight = nodeRight.left;
                 }
                 
                
                 tree.data = nodeRight.data;    
                 if(lastLeftParent != null)
                     lastLeftParent.left = nodeRight.right;    // 链接右子树
                 else
                     tree.right = nodeRight.right;            // 链接右子树
             }
         }
         
         public static void main(String[] args){
             Tree tree = new Tree(4);
             tree.addTreeNode(5);
             tree.addTreeNode(6);
             tree.addTreeNode(3);
             tree.addTreeNode(7);
             tree.addTreeNode(8);
             tree.addTreeNode(9);
            
    
    //         System.out.println(tree.searchTreeNode(7, tree.root).data);
             System.out.println("---");
             tree.iterate(tree.root);
         }
         
    }
  • 相关阅读:
    [转]WebForm中使用MVC
    [转]外贸出口流程图
    [转]查看SQL Server被锁的表以及如何解锁
    [转]RDL Report in Visual Studio New page per Record
    [转]Sql Server Report Service 的部署问题
    [转]ASP.NET MVC4中@model使用多个类型实例的方法
    [转]告别写计划的烦恼!一页纸四步打造出一份牛逼的商业计划
    [转]LINQ: Using INNER JOIN, Group and SUM
    [转] 比特币『私钥』『公钥』『钱包地址』间的关系
    [转]SQL SERVER数据库删除LOG文件和清空日志的方案
  • 原文地址:https://www.cnblogs.com/JimmyXie/p/3714664.html
Copyright © 2011-2022 走看看