算法:二叉树

这篇博客详细介绍了排序二叉树(BST)的基本操作,包括查找、插入和删除结点的算法实现。查找操作通过比较结点值来定位;插入操作会在合适位置创建新结点;删除操作则根据结点是否有子结点来选择不同的删除策略。同时,博客还提供了前序、中序和后序遍历二叉树的方法。
摘要由CSDN通过智能技术生成

在这里插入图片描述

  1. A是根节点,Leaf是尾结点(比如H、I、J、F、G)
  2. Parent Node;Child Node; Left/Right Node;
  3. subtree是子树
  4. Height是指一个结点到尾结点的路径;Depth是指一个结点到根结点的路径
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

排序二叉树(BST)查找结点

public TreeNode get(int key){
    TreeNode current=root;
    while(current!=null &&current.value!=key){
       if(key<current.value){
             current=current.left;
        }else if(key>current.value){
             current=current.right;
        }
     }
     return current==null?null:current;
     }

排序二叉树(BST)插入结点

public void insert(int key){
     if(root===null){
          root=new TreeNode(key);
          return;
      }
      TreeNode current=root;
      TreeNode parent=null;
      while(true){
            parent=current;
            if(key>parent.value){
                  current=parent.right;
                  if(current==null){
                         parent.right=new TreeNode(key);
                         return;
                    }
              }
              else if(key<parent.value){
                  current=parent.left;
                  if(current==null){
                         parent.left=new TreeNode(key);
                         return;
                    }
              }
              else return; //BST 不允许有两个相同的结点存在
       }
   }

排序二叉树(BST)删除结点

分为三种情况:

  1. 删除的是尾结点----直接删除就可
  2. 删除的结点有且只有一个小孩—把它的小孩替代他
  3. 删除的结点有子树----左节点最大的或者右子树最小的

请添加图片描述

public boolean delete(int key) {
    TreeNode parent = root;
    TreeNode current = root;
    boolean isLeftChild = false;
    while(current != null && current.value != key) {
        parent = current;
        if(current.value  > key) {
            isLeftChild = true;
            current = current.left;
        } else {
            isLeftChild = false;
            current = current.right;
        }
    }
    if(current == null) {
        return false;
    }
    // Case 1: if node to be deleted has no children
    if(current.left == null && current.right == null) {
        if(current == root) {
            root = null;
        } else if(isLeftChild) {
            parent.left = null;
        } else {
            parent.right = null;
        }
    // Case 2: if node to be deleted has only one child
    } else if (current.right == null) {
        if(current == root) {
            root = current.left;
        } else if (isLeftChild) {
            parent.left = current.left;
        } else {
            parent.right = current.left;
        }
    } else if (current.left == null) {
        if(current == root) {
            root = current.right;
        } else if (isLeftChild) {
            parent.left = current.right;
        } else {
            parent.right = current.right;
        }
    // Case 3: current.left != null && current.right != null
    } else {
        TreeNode successor = getSuccessor(current);
        if (current == root) {
            root = successor;
        } else if (isLeftChild) {
            parent.left = successor;
        } else {
            parent.right = successor;
        }
        successor.left = current.left;
    }
    return true;
}

private TreeNode getSuccessor(TreeNode node) {
    TreeNode successor = null;
    TreeNode successorParent = null;
    TreeNode current = node.right;
    while (current != null) {
        successorParent = successor;
        successor = current;
        current = current.left;
    }
    if (successor != node.right) {
        successorParent.left= successor.right;
        successor.right = node.right;
    }
    return successor;
}

前序、中序、后序遍历树

在这里插入图片描述

public static void preOrderTraversal(TreeNode root) {
    if(root == null) {
        return;
    }
    System.out.println(root.value);
    preOrderTraversal(root.left);
    preOrderTraversal(root.right);
}
public static void inOrderTraversal(TreeNode root) {
    if(root == null) {
        return;
    }
    inOrderTraversal(root.left);
    System.out.println(root.value);
    inOrderTraversal(root.right);
}
public static void postOrderTraversal(TreeNode root) {
    if(root == null) {
        return;
    }
    postOrderTraversal(root.left);
    postOrderTraversal(root.right);
    System.out.println(root.value);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值