前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >据结构与算法(八) 二叉树的练习

据结构与算法(八) 二叉树的练习

作者头像
老沙
发布2019-10-15 16:57:46
5680
发布2019-10-15 16:57:46
举报
文章被收录于专栏:老沙课堂

练习

一、计算二叉树高度

递归

相当于求根节点的高度 根节点高度等于1+子节点最高的高度

代码语言:javascript
复制
public int height() {
  return height(root);
}

private int  height(Node<E> node) {
  if (node == null) {
    return 0;
  }
  return 1 + Math.max(height(node.left), height(node.right));
}
迭代
利用层序遍历

•设定levelSize初始值为1(只有一个根节点)•当进行while循环的时候 levelsize-- 操作。因为levelSize和每层节点个数相等。所以当levelSize为0的时候,下一个levelSize的大小就等于此时在队列中的元素个数。•当levelSize== 0的时候 •进行赋值下一层的个数 levelSize = queue.size()•此时代表一个层级遍历结束 height++

代码如下图所示
代码语言:javascript
复制
public int height() {
        if (root == null) {
            return 0;
        }
        int height = 0;
        int  levelSize = 1;

        Queue<Node<E>> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            Node<E> 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 ++;
            }
        }
        return height;
    }

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

层序遍历

思路

while(队列不为空) {

如果标记为叶子节点 判断是否为叶子节点,如果不是返回false

•Left •如果left != null 入队•如果left == null •如果right != null 返回false;•Right•如果right != null 入队•标记其余都是叶子节点

}

•当层序遍历结束后返回true;

代码语言:javascript
复制
private boolean isCompleteTree(Node<E> root) {

  Queue<Node<E>> queue = new LinkedList<Node<E>>();
  queue.offer(root);
  boolean leaf = false;

  while (queue.size() != 0) {
    Node<E> node = queue.poll();

    if (leaf) {
      if (!node.leaf()) {
        return false;
      }
    }

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

    if (node.right != null) {
      queue.offer(node.right);
    }else {
      leaf = true;
    }
  }
  return true;
}

三、翻转二叉树

示例:
输入:
代码语言:javascript
复制
     4
   /   \
  2     7
 / \   / \
1   3 6   9

##### 输出:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/invert-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
利用遍历翻转
代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return root;
        }

        TreeNode tempNode = root.left;
        root.left = root.right;
        root.right = tempNode;

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

        return root;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老沙说点事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 练习
    • 一、计算二叉树高度
      • 二、判断一颗树是否为完全二叉树
        • 三、翻转二叉树
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档