二叉树算法

简单的二叉树规划,及其前中后序遍历…

二叉树定义:所有节点的值小于右边的值,大于左边的值

设计一个根节点 Node root; 为入口

存储数据节点为:

private class Node{
    private Key key;		// 键
    private Value val;		// 值
    private Node left, right;	//左右节点
    private int N;		// 该节下总数
    public Node(Key key, Value val, int N){
        this.key = key;
        this.val = val;
        this.N = N;
    }
}

查找:通过判断找到合适的位置,值相同则覆盖(递归查找)

private Value get(Node root, Key key){
    if (root == null) return null;
    int cmp = key.compareTo(root.key);
    if(cmp < 0){
        return get(root.left,key);
    }else if(cmp > 0){
        return get(root.right,key);
    }else{
        return root.val;
    }
}

插入(略,也是同上递归判断,然后插入,并重新递归计算每个节点总数)

删除操作:

  1. 先找到要删除的节点

  2. 如果此节点的左节点为null,直接返回右节点接上就好了

  3. 如果此节点的右节点为null,直接返回左节点接上就好了

  4. 如果左右节点都在,则找有节点下最小值,然后替换就好

前序遍历:先遍历根结点,然后遍历左子树,最后遍历右子树 (根左右)

实现1:递归调用略

实现2:堆实现

public void preorder(Node root){
    Stack<Node> stack = new Stack<>();
    stack.push(root);
    while(!stack.empty()){
        Node tmproot = stack.pop();
        System.out.println(tmproot.key);	// 此处输出节点或者 处理节点
        if(tmproot.right != null) stack.push(rmproot.right);
        if(tmproot.left != null) stack.push(rmproot.left);
    }
}

中序遍历:先遍历左子树,然后遍历根结点,最后遍历右子树 (左根右)

实现1:递归调用略

实现2:堆实现

public void midorder(Node root){
    if(root == null) return ;
    Stack<Node> stack = new Stack<>();
    stack.push(root);
    while(!stack.empty()){
        Node tmproot = stack.pop();
        if(tmproot.left != null){
            if(tmproot.right != null) stack.push(tmproot.right);
            stack.push(tmproot);
            stack.push(tmproot.left);
        }else{
            System.out.println(tmproot.key);	// 此处处理节点
        }
    }
}

后序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点(左右根)

实现1:递归调用略

实现2:堆实现

public void midorder(Node root){
    if(root == null) return ;
    Stack<Node> stack = new Stack<>();
    stack.push(root);
    while(!stack.empty()){
        Node tmproot = stack.pop();
        if(tmproot.left != null){
            if(tmproot.right != null) stack.push(tmproot.right);
            stack.push(tmproot.left);		// 在变换右根顺序就好
            stack.push(tmproot);
        }else{
            System.out.println(tmproot.key);	// 此处处理节点
        }
    }
}
其他:

如果已知中序遍历和前序遍历(或者后续遍历),就可以推到出整个二叉树。

题如:牛客网

参考资源:

http://blog.csdn.net/prince_jun/article/details/7699024