二叉树

作者: 环球探测 | 来源:发表于2016-03-24 09:40 被阅读115次

1. 二叉树分类

满二叉树:所有层的节点数均达到了最大值
完全二叉树:除了最后一层外,所有层的节点数都达到了最大值,最后一层若不满,则只缺少右边部分。
平衡二叉树::它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度之差之差的绝对值不超过1。

2. 度为二的节点数和叶子节点数的关系

设二叉树的叶子节点个数为x,二度节点个数为y,1度节点个数为z,总结点个数为N,则有:
x+y+z= N;
又 N个节点一共有 N-1个树枝,二度节点有2个树枝,1度节点有1个,叶子没有,所以:
2y+z = N-1;
可得出 x = y+1.

3.遍历

只要给出中根遍历,先根遍历和后根遍历的一种,就能确定一棵二叉树。
只给出先跟顺序和后根顺序无法确定一棵二叉树。例如:

  • 树1:根A和一个左子节点B
  • 树2:根A和一个右子节点B

1.递归遍历
只给出先根遍历的递归代码:
Java
//先根遍历
public void preVisit(Node node){
if(node== null){
return;
}
System.out.println(node.val);
preVisit(node.left);
preVisit(node.right);
}

2.非递归遍历:
```Java```
//非递归先根遍历,
//1 对每个节点,先进行访问,然后右节点进栈,左节点进栈
//2 弹出栈顶,对栈顶进行1的操作
    public void nonRecursivePre(TreeNode node) {
        if (node == null) {
            return;
        }
        Stack<TreeNode> nodeStack = new Stack<>();
        nodeStack.push(node);
        while (!nodeStack.empty()) {
            TreeNode peek = nodeStack.pop();
            System.out.print(peek.val);
            if (peek.right != null) {
                nodeStack.push(peek.right);
            }
            if (peek.left != null) {
                nodeStack.push(peek.left);
            }
        }
    }
//中根遍历
    public void nonRecursiveMiddle(TreeNode node) {
        if (node != null) {
            Stack<TreeNode> nodeStack = new Stack<>();
            while (node != null || !nodeStack.empty()) {
                while (node != null) {
                    nodeStack.push(node);
                    node = node.left;
                }
                node = nodeStack.pop();
                System.out.print(node.val);
                node = node.right;
            }
        }
    }
//后根遍历
    public void nonRecursiveAfter(TreeNode node) {
        if (node != null) {
            Stack<TreeNode> nodeStack = new Stack<>();
            TreeNode pre = null;
            while (node != null || !nodeStack.empty()) {
                while (node != null) {
                    nodeStack.push(node);
                    node = node.left;
                }
                node = nodeStack.peek();
                if (node.right == null || node.right.equals(pre)) {
                    System.out.print(node.val);
                    pre = node;
                    nodeStack.pop();
                    node = null;
                } else {
                    node = node.right;
                }
            }
        }
    }

4. 二叉树、树、和森林之间的转换

二叉树、树、和森林之间的转换

相关文章

  • 数据结构与算法-二叉树02

    二叉树的定义 二叉树的特点 二叉树的五中基本形态 其他二叉树 斜二叉树 满二叉树 完全二叉树图片.png满二叉树一...

  • 二叉树

    二叉树 高度 深度真二叉树 满二叉树 完全二叉树 二叉树遍历前序 中序 后序层序遍历 翻转二叉树 递归法...

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 树与二叉树

    **树 ** 二叉树 满二叉树 完全二叉树 三种遍历方法 树与二叉树的区别 二叉查找树 平衡二叉树 红黑二叉树

  • 二叉树的宽度优先搜索(层次遍历,BFS)

    二叉树结构: 二叉树宽度优先搜索: 按照二叉树的层数依次从左到右访问二叉树的节点;例如:给定一个二叉树: 按照宽度...

  • 剑指 offer:39、平衡二叉树

    39. 平衡二叉树 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 解题思路: 平衡二叉树:Wiki:在...

  • Algorithm小白入门 -- 二叉树

    二叉树二叉树构造二叉树寻找重复子树 1. 二叉树 基本二叉树节点如下: 很多经典算法,比如回溯、动态规划、分治算法...

  • 14-树&二叉树&真二叉树&满二叉树

    一、树 二、二叉树 三、真二叉树 四、满二叉树

  • 二叉树的应用

    完美二叉树(满二叉树) 除了最下一层的节点外,每层节点都有两个子节点的二叉树为满二叉树 完全二叉树 除二叉树最后一...

  • 12.树Tree(2)

    目录:1.二叉树的基本概念2.二叉树的性质3.二叉树的创建4.二叉树的遍历 1.二叉树的基本概念 2.二叉树的性质...

网友评论

      本文标题:二叉树

      本文链接:https://www.haomeiwen.com/subject/iseklttx.html