算法-01

作者: GJCode | 来源:发表于2019-08-13 12:34 被阅读0次

一、二叉树

1、前序遍历:先访问根节点、前序遍历左子树、前序遍历右子树

private void preorderTraversal() {
    preorderTraversal(root);
}

private void preorderTraversal(Node<E> node) {
    if(node == null) return;
    System.out.printIn(node.element);
    preorderTraversal(root.left);
    preorderTraversal(root.right);
}

2、中序遍历:先访问中序遍历左子树、根节点、中序遍历右子树

private void inorderTraversal() {
    inorderTraversal(root);
}

private void inorderTraversal(Node<E> node) {
    if(node == null) return;
    inorderTraversal(root.left);
    System.out.printIn(node.element);
    inorderTraversal(root.right);
}

3、后序遍历:先访问后序遍历左子树、后序遍历右子树、根节点

private void postorderTraversal() {
    postorderTraversal(root);
}

private void postorderTraversal(Node<E> node) {
    if(node == null) return;
    postorderTraversal(root.left);
    postorderTraversal(root.right);
    System.out.printIn(node.element);
}

4、层序遍历:从上到下,从左到右依次访问每一个节点,使用队列

思路:
1、将根节点入队
2、循环下列操作,直到队列为空
a、将队头节点A出队,进行访问
b、将A的左子节点入队
c、将A的右子节点入队

public void reverseTree() {
    if(root == null) return;
    Queue<Node> queue = new LinkedList<>();
    queue.offer(root);

    while(!queue.isEmpty()) {
        Node node = queue.poll()
        Sysytem.out.printIn(node.element)
        if(node.left != null) {
            queue.offer(node.left)
        }
        if(node.right != null) {
            queue.offer(node.right)
        }
    }
}

5、计算二叉树的高度

public int height() {
    return height(root);
}

1、递归
private int height(Node node) {
    if(node == null) return 0;
    return 1 + Max.max(height.left, height.right);
}

2、迭代,使用层序遍历方式
public int height() {
    if(root== null) return 0;
    int height = 0;
    int levelSize = 1;
    Queue<Node> queue = new LinkedList<>();
    queue.offer(root);

    while(!queue.isEmpty()) {
        Node node = queue.poll()
        levelSize--;
        if(node.left != null) {
            queue.offer(node.left)
        }
        if(node.right != null) {
            queue.offer(node.right)
        }
        if(levelSize == 0) {
            levelSize = queue.size();
            height++;
        }
    }
}

6、判断一个树是否为完全二叉树

1、思路
a、如果树为空,返回false
b、如果树不为空,开始层序遍历二叉树(队列方式)

  • 如果node.left !=null && node.right != null,将 node.left、node.right 按顺序入队
  • 如果node.left == null && node.right != null ,返回false
  • 如果node.left != null && node.right == null 或者node.left == null && node.right == null,那么后面遍历的所有节点都为叶子节点,才是完全二叉树,否则返回false
public boolean isComplete() {
    if(root == null) return false;
    Queue<Node> queue = new LinkedList<>();
    queue.offer(root);

    boolean leaf = false;

    while(!queue.isEmpty()) {
        Node node = queue.poll();
        if(lead && !(node.left == null && node.right == null)) {
            return false;
        }
        if(node.left != null && node.right != null) {
            queue.offer(node.left);
            queue.offer(node.right);
        } else if(nodel.left = == null && node.right != null) {
            return false;
        } else { // 判断后面遍历的节点都是叶子结点
            leaf = true;
        }
    }
    return true;
}

7、翻转二叉树

a、前序遍历

private TreeNode invertTree(TreeNode root) {
    if(root == null) return root;
    
    TreeNode tmp = root.left;
    root.left = root.right;
    root.right = tmp;

    invertTree(root.left);
    invertTree(root.right);

    return root;
}

b、中序遍历

private TreeNode invertTree(TreeNode root) {
    if(root == null) return root;
    
    invertTree(root.left);

    TreeNode tmp = root.left;
    root.left = root.right;
    root.right = tmp;
    invertTree(root.left);

    return root;
}

c、后序遍历

private TreeNode invertTree(TreeNode root) {
    if(root == null) return root;
    
    invertTree(root.left);
    invertTree(root.right);

    TreeNode tmp = root.left;
    root.left = root.right;
    root.right = tmp;

    return root;
}

d、层序遍历

private TreeNode invertTree(TreeNode root) {
    if(root == null) return root;

    Queue<Node> queue = new LinkedList<>();
    queue.offer(root);

    while (! queue.isEmpty()) {

        Node node = queue.poll();
        Node tmp = node.left;
        node.left = node.right;
        node.right = tmp;

        if(node.left != null) {
            queue.offer(node.left);
        }
        if(node.left != null) {
            queue.offer(node.right);
        }
    }
}

二、计算完全二叉树的结点个数

// n:总结点数量
当n是偶数,n0 = n / 2
当n时奇数,n0 = (n + 1)/2
n0 = (n + 1) >> 1

相关文章

  • 算法

    01 发刊词 | 给你的人生明确算法 老喻的人生算法课 07-26 进入课程 > 01 发刊词:给你的人生明确算法...

  • 100天iOS数据结构与算法实战 Day01

    100天iOS数据结构与算法实战 Day01 100天iOS数据结构与算法实战 Day01

  • 读书笔记

    读书笔记/人生算法之无知、衰朽和贪婪 【标题】人生算法之无知、衰朽和贪婪 【书籍】人生算法 【01】人生算法之无知...

  • 算法-01

    一、二叉树 1、前序遍历:先访问根节点、前序遍历左子树、前序遍历右子树 2、中序遍历:先访问中序遍历左子树、根节点...

  • 01算法

    1.算法定义 算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或者多个...

  • 范型编程_变易算法

    title: 范型编程_变易算法date: 2016-05-01 11:47:47categories: 算法 #...

  • 什么是算法

    01 算法的定义 算法是对特定问题求解步骤的一种描述,步骤是有限的。 02 算法的特性 算法是有穷性的。算法总是会...

  • python 简单排序

    数据结构与算法 01 我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序。 排序算法大体可分...

  • 读书笔记

    读书笔记/人生算法十八关之第四-九关 【标题】人生算法十八关之四到九关 【书籍】人生算法 【01】人生算法十八关之...

  • Rust数据结构——排序算法(一)

    Rust数据结构——排序算法(一) 0x01 常见的排序算法 排序算法是数据结构中很常见的算法。如果你了解过数据结...

网友评论

      本文标题:算法-01

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