二叉树

Posted wushenghfut

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树相关的知识,希望对你有一定的参考价值。

二叉树:树的每个节点最多只能有两个子节点

  上图的第一幅图B节点有DEF三个子节点,就不是二叉树,称为多路树;而第二幅图每个节点最多只有两个节点,是二叉树,并且二叉树的子节点称为“左子节点”和“右子节点”。上图的D,E分别是B的左子节点和右子节点。

  如果我们给二叉树加一个额外的条件,就可以得到一种被称作二叉搜索树(binary search tree)的特殊二叉树。

  二叉搜索树要求:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

技术图片

 

 

/**
     * hash
     * @param key
     * @return
     */
    private static <k> int getHashCode(k key){
        int h;
        //生成的hash值的随机性会增大
        return (h = key.hashCode()) ^ (h >>> 16);
    }

    Node root;
    class Node <k,v>{
        private k key;
        private v value;
        private int hasKey;    //节点数据
        private Node leftChild; //左子节点的引用
        private Node rightChild; //右子节点的引用
        private int isDelete = 0; //是否删除
        public Node(int hasKey,k key,v value){
            this.hasKey = hasKey;
            this.key = key;
            this.value = value;
        }
    }

    /**
     * 查找节点
     * @param key
     * @return
     */
    public Node find(Object key){
        int hashKey = getHashCode(key);
        if (root==null){
            return root;
        }
        Node curr = root;
        while (curr!=null){
            if (curr.hasKey==hashKey){
                return curr;
            }else if (curr.hasKey>hashKey){
                curr = curr.leftChild;
            }else {
                curr = curr.rightChild;
            }
        }
        return null;
    }

    /**
     * 插入新节点
     * @param key
     * @param value
     * @return
     */
    public Node insert(Object key,Object value){
        int hashKey = getHashCode(key);
        Node newNode = new Node(hashKey,key,value);
        if (root==null){
            root = newNode;
            return newNode;
        }
        Node curr = root;
        while (curr!=null){
            Node parentNode = curr;
            if (curr.hasKey>hashKey){
                curr = curr.leftChild;
                if (curr==null){
                    parentNode.leftChild = newNode;
                }
            }else {
                curr = curr.rightChild;
                if (curr==null){
                    parentNode.rightChild = newNode;
                }
            }
        }
        return newNode;
    }

    /**
     * 删除节点
     * @param key
     * @return Node
     */
    public Node delete(int key){
        int hashKey = getHashCode(key);
        Node curr = root;
        while (curr!=null){
            if (curr.hasKey==hashKey){
                curr.isDelete=1;
                return curr;
            }else if (curr.hasKey>hashKey){
                curr = curr.leftChild;
            }else {
                curr = curr.rightChild;
            }
        }
        return null;
    }

 

以上是关于二叉树的主要内容,如果未能解决你的问题,请参考以下文章

数据结构 二叉树

数据结构二叉树经典基础习题

数据结构 二叉树的简单理解和代码实现

用c语言写二叉树,源代码。

数据结构中二叉树的顺序存储结构代码怎么编写?

二叉树练习题