树和二叉树总结(三)—BST二叉排序树

二叉排序树的特点:中序遍历是递增的…

下面复习几个常用的操作:

1.如何向BST中插入一个节点

思路:用递归做...  首先,判断head是否为空,为空就是需要插的地方;  然后,判断head的data是不是和新Node一样,一样就是重复Node,不加  最后,若比当前head.data小,则放到插到左节点的树你,否则就插到右节点
public static Node insertBST(Node root, Node keyNode) {
        if (root== null) { //如果遇到空的地方,就是该插入的地方...
            root= keyNode;
        } else { //如果节点不为空,则需要查找对应的位置,和二分法查找类似
            if (root.data == keyNode.data) { //找到一个同值得数,直接返回
                return root;
            } else if (keyNode.data < root.data) {
                root.left = insertBST(root.left, keyNode);
            } else {
                root.right = insertBST(root.right, keyNode);
            }
        }
        return root;
    }

2.如何创建BST

思路
  和给BST插值一样,逐步insert...
public static Node createBST(int[] arr) {
        Node root = null;
        for (int i = 0; i < arr.length; i++) {
            root = insertBST(root, new Node(arr[i]));
        }
        return root;
    }

3.判断一个树是不是二叉排序树

思路:  因为二叉排序树的中序遍历是递增有序序列,则可以利用这个特点,直接中序遍历二叉树,如果保证  前一个比后一个小,那么证明该树为一颗二叉排序树...
public static boolean judgeBst(Node root) {
        int preVal = 0;
        Node cur = root;
        Stack<Node> stack = new Stack<>();
        while (true) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            if (stack.isEmpty())
                break;
            cur = stack.pop();
            if (preVal > cur.data) {
                return false;
            } else {
                preVal = cur.data;
            }
            cur = cur.right;
        }
        return true;
    }

4.从BST中删除一个节点

思路:
  1.找到key  2.若key是叶子节点,直接删  3.若key只有左或右子树,直接隔过Node(key)接上其左或右子树...  4.若key既有左子树又有右子树,找到其左子树的最右边的节点rightest,用rightest代替key节点...然后接着从第二步开始判断如何把rightest删掉...
public static Node deleteNodeFromBST(Node root, int key) {
        if (root == null) return null;
        if (key < root.data) {
            root.left = deleteNodeFromBST(root.left, key);
        } else if (key > root.data) {
            root.right = deleteNodeFromBST(root.right, key);
        } else {
            //找到key
            if (root.left == null) {
                return root.right;
            } else if (root.right == null) {
                return root.left;
            }
            //有左右子树的情况...
            Node tmp = root;
            //找到root左子树中最右边的那个Node, 这里只能从tmp去遍历
            root = findRightest(tmp.left);
            root.left = deleteRightest(tmp.left);
            root.right = tmp.right;
        }
        return root;
    }

    // 找到左子树中最右的那个Node,因为它是root左子树的最大值...
    private static Node findRightest(Node root) {
        if (root == null) return null;
        while (root.right != null) {
            root = root.right;
        }
        return root;
    }

    // 删除刚刚从发现的那个点(root左子树中最右边的那个rightest)
    // 因为是最右面的Node,则必然没有右子树
    private static Node deleteRightest(Node root) {
        if (root.right == null)
            return root.left;
        root.right = deleteRightest(root.right);
        return null;
    }
时间: 2024-10-28 19:16:57

树和二叉树总结(三)—BST二叉排序树的相关文章

数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n(≥0)结点组成的有限集合.{N.沃恩}     (树是n(n≥1)个结点组成的有限集合.{D.E.Knuth})      在任意一棵非空树中:        ⑴有且仅有一个没有前驱的结点----根(root).        ⑵当n>1时,其余结点有且仅有一个直接前驱.         ⑶所有结

树和二叉树总结及算法实现

[注:相关概念来自经典教材.百度百科及维基百科] 树 树状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合.它具有以下的特点: 每个节点(node)有零个或多个子节点: 没有父节点的节点称为根节点: 每一个非根节点有且只有一个父节点: 除了根节点外,每个子节点可以分为多个不相交的子树: 如图所示: 相关概念: 节点的度:一个节点含有的子树的个数称为该节点的度: 树的度:一棵树中,最大的节点的度称为树的度: 叶节点或终端节点:度为零的节点: 非终端节点或分支节点:度不为零

树、二叉树、满二叉树、完全二叉树

自由树 自由树是一个连通的,无回路的无向图. 令G=(V,E)为一个无向图.下面的表述是等价的. 1)        G是自由树. 2)        G中任意两个顶点由唯一一条简单路径得到. 3)        G是连通的,但从E中去掉任何边后得到的图都是非连通的. 4)        G是无回路的,且|E|=|V|-1. 5)        G是连通的,且|E|=|V|-1. 6)        G是无回路的,但添加任何边到E中得到的图包含回路. 二叉树 在计算机科学中,二叉树是每个节点最多

(树)判断二叉树是否为BST

题目:判断一颗二叉树是否为BST. 思路:其实这个问题可以有多个解决方法. 方法一:递归解决.根据BST的特性.左边的小于根节点的值,右边的大于根节点的值.并且对于每一棵子树都是如此.所以我们可以直接递归的对左右子树的值与根节点的值进行比较.左子树的值小于当前根节点的值,将当前根节点的值作为最大值传入左子树,左子树的值都小于他,递归处理:右子树的值都大于根节点的值,将根节点的值作为最小值传入右子树,右子树的值都大于他. 代码: /** * Definition for binary tree *

数据结构——第三章树和二叉树:03树和森林

1.树的三种存储结构: (1)双亲表示法: #define MAX_TREE_SIZE 100 结点结构: typedef struct PTNode { Elem data; int parent; //双亲位置域 } PTNode; (2)孩子双亲链表表示法: typedef struct PTNode { Elem data; int parent; //双亲位置域 struct CTNode* nextchild; } *ChildPtr; (3)树的二叉链表(孩子-兄弟)存储表示法:

数据结构基础温故-4.树与二叉树(中)

在上一篇中,我们了解了树的基本概念以及二叉树的基本特点和代码实现,还用递归的方式对二叉树的三种遍历算法进行了代码实现.但是,由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多.而且,如果递归深度太大,可能系统撑不住.因此,我们使用非递归(这里主要是循环,循环方法比递归方法快, 因为循环避免了一系列函数调用和返回中所涉及到的参数传递和返回值的额外开销)来重新实现一遍各种遍历算法,再对二叉树的另外一种特殊的遍历—层次遍历进行实现,最后再了解一下特殊的二叉树—二叉查找树. 一.递归与循环的区别及

BST二叉排序树的查找和删除的完整C代码

二叉排序树的查找算法 假定二叉排序树的根节点指针为root,给定的关键字值为key,则查找算法可描述为: 置初值:p = root : 如果 key = p -> data ,则查找成功,算法结束: 否则,如果key < p->data ,而且 p 的左子树非空,则将 p 的左子树根送 p ,转步骤 2 :否则,查找失败,算法结束: 否则,如果 key > p->data ,而且 p 的右子树非空,则将 p 的右子树根送 p ,转步骤 2 :否则,查找失败,算法结束. //B

二叉树的三种遍历方式的循环和递归的实现方式

///////////////////头文件:BST.h//////////////////////// #ifndef BST_H #define BST_H #include "StdAfx.h" #include<iostream> #include<stack> template<typename DataType> class BST { public: class Node { public: Node(int data=0):m_dat

数据结构笔记整理第5章:树和二叉树

第5章 树和二叉树 本章内容 本章主要介绍树.二叉树的概念,遍历方法以及应用等,本章在考研中是重点内容. 5.1 树相关的基本概念 树是一种非线性的数据结构,是若干结点的集合,有唯一的根结点和若干棵互不相交的子树构成.其中每一棵子树又是一棵树,也是由唯一的根结点和若干棵互不相交的子树组成的,由此可知:树的定义是递归的.树的结点数目可以为0,为0的时候是一棵空树. 结点:结点不仅包含数据元素,而且包含指向子树的分支. 结点的度:结点拥有子树的个数或者分支的个数. 树的度:树中各结点度的最大值. 叶