树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等等。本文努力对二叉树相关题目做一个较全的整理总结,希望对找工作的同学有所帮助。

二叉树节点定义如下:

public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){
val = x;
left = null;
right = null;
}
}

题目列表:

1. 求二叉树中的节点个数
2. 求二叉树的深度
3. 前序遍历,中序遍历,后序遍历
4.分层遍历二叉树(按层次从上往下,从左往右)
5. 将二叉查找树变为有序的双向链表
6. 求二叉树第K层的节点个数
7. 求二叉树中叶子节点的个数
8. 判断两棵二叉树是否结构相同
9. 判断二叉树是不是平衡二叉树
10. 求二叉树的镜像
11. 求二叉树中两个节点的最低公共祖先节点
12. 求二叉树中节点的最大距离
13. 由前序遍历序列和中序遍历序列重建二叉树
14.判断二叉树是不是完全二叉树

按知识点分类

1. 二叉树的遍历。

1.1 深度优先遍历。可解答二叉树中的节点个数、前序遍历,中序遍历,后序遍历等问题。

1.1.1 递归

public void preOrder(ArrayList<Integer> res, TreeNode node){
if(node == null){
return;
}
res.add(node.val);
preOrder(res, node.left);
preOrder(res, node.right);
} public void inOrder(ArrayList<Integer> res, TreeNode node){
if(node == null){
return;
}
inOrder(res, node.left);
res.add(node.val);
inOrder(res, node.right);
} public void postOrder(ArrayList<Integer> res, TreeNode node){
if(node == null){
return;
}
postOrder(res, node.left);
postOrder(res, node.right);
res.add(node.val);
}

1.1.2 非递归

public ArrayList<Integer> preOrderStack(TreeNode node){
if(node == null){
return null;
}
ArrayList<Integer> res = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode p = node;
while(p != null || !stack.isEmpty()){
while(p != null){
res.add(p.val);
stack.push(p);
p = p.left;
}
if(!stack.isEmpty()) {
p = stack.pop();
p = p.right;
}
}
return res;
} public ArrayList<Integer> inOrderStack(TreeNode node){
if(node == null){
return null;
}
ArrayList<Integer> res = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode p = node;
while(p != null || !stack.isEmpty()){
while(p != null){
stack.push(p);
p = p.left;
}
if(!stack.isEmpty()){
p = stack.pop();
res.add(p.val);
p = p.right;
}
}
return res;
} public ArrayList<Integer> postOrderStack(TreeNode node){
if(node == null){
return null;
}
TreeNode p;
TreeNode pre = null;
Stack<TreeNode> stack = new Stack<TreeNode>();
ArrayList<Integer> res = new ArrayList<Integer>();
stack.push(node);
while(!stack.isEmpty()){
p = stack.peek();
if((p.left == null && p.right == null) || (pre != null && (pre == p.right || pre == p.left))){
res.add(p.val);
pre = p;
stack.pop();
}else{
if(p.right != null){
stack.push(p.right);
}
if(p.left != null){
stack.push(p.left);
}
}
}
return res;
}

1.2 广度优先遍历。可解答分层遍历二叉树(按层次从上往下,从左往右)等问题。

1.2.1 递归

1.2.2 非递归

轻松搞定面试中的二叉树题目(java&python)的更多相关文章

  1. 一篇文章搞定面试中的二叉树题目(java实现)

    最近总结了一些数据结构和算法相关的题目,这是第一篇文章,关于二叉树的. 先上二叉树的数据结构: class TreeNode{ int val; //左孩子 TreeNode left; //右孩子 ...

  2. 面试大总结之二:Java搞定面试中的二叉树题目

    package BinaryTreeSummary; import java.util.ArrayList; import java.util.Iterator; import java.util.L ...

  3. 一篇文章搞定面试中的链表题目(java实现)

    最近总结了一下数据结构和算法的题目,这是第二篇文章,关于链表的,第一篇文章关于二叉树的参见 废话少说,上链表的数据结构 class ListNode { ListNode next; int val; ...

  4. (转)面试大总结之一:Java搞定面试中的链表题目

    面试大总结之一:Java搞定面试中的链表题目 分类: Algorithm Interview2013-11-16 05:53 11628人阅读 评论(40) 收藏 举报 链表是面试中常出现的一类题目, ...

  5. 面试大总结:Java搞定面试中的链表题目总结

    package LinkedListSummary; import java.util.HashMap; import java.util.Stack; /** * http://blog.csdn. ...

  6. 剑指XX游戏(六) - 轻松搞定面试中的红黑树问题

    原文地址 http://blog.csdn.net/silangquan/article/details/18655795?utm_source=tuicool&utm_medium=refe ...

  7. 轻松搞定面试中的“虚"

    提要 今天要整理的知识点是C++中有关虚的一切. 包括:虚函数,纯虚函数,虚基类,虚继承... 1.什么是虚函数,有什么作用? 在基类用virtual声明成员函数为虚函数.这样就可以在派生类中重新定义 ...

  8. Java原来还可以这么学:如何搞定面试中必考的集合类

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  9. 三步轻松搞定delphi中CXGRID手动添加复表头(多行表头,报表头)

    网上有代码动态生成cxgrid多行表头的源码,地址为:http://mycreature.blog.163.com/blog/static/556317200772524226400/ 如果要手动设计 ...

随机推荐

  1. Browser默认书签加载过程

    Browser配置默认书签——string.xml中<string-array name="bookmarks" translatable="false" ...

  2. 【转】Linux下查看文件和文件夹大小

    当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.    du可以查看文件及文件夹的大小. ...

  3. [SmartFoxServer入门]服务器安装

    安装SFS2X: SFS2X平台安装操作和步骤都很简单.我们建议先查看对系统的要求,然后根据你选择的操作系统按照指定的安装向导进行安装. 系统要求: SFS2X是一款支持所有主流操作系统,运行在JVM ...

  4. WordPaster-Firefox浏览器控件安装方法

    将WordPaster.xpi拖到Firefox扩展面板中安装       新版Firefox可能无法通过验证,如果Firefox提示无法安装,则需要进入about:config中将xpinstall ...

  5. JSON.parse解析单引号名值对报错

    今天整理代码的时候发现JSON.pare解析时会报了一个错误,而且很难找原因,调试了几分钟没有成功,猜测可能是单双引号引起的错误.修改了单双引号后程序正常运行了,现在记录下这个bug. 关于JSON. ...

  6. We have detected that MySQL products under the Commercial license are installed. In order to proceed with this GPL installation these Commercial

    下载了MySQL 5.6.15,在安装时,出现了下面的提示信息: 按提示信息的要求单击“是”,结果安装就无法进行下去. 从提示信息上看,意思是指电脑中原来安装有商业版的许可,现在要转换成为GPL许可. ...

  7. 跟我一起学WCF(6)——深入解析服务契约[下篇]

    一.引言 在上一篇博文中,我们分析了如何在WCF中实现操作重载,其主要实现要点是服务端通过ServiceContract的Name属性来为操作定义一个别名来使操作名不一样,而在客户端是通过重写客户端代 ...

  8. ASP.NET WebAPI 生成帮助文档与使用Swagger服务测试

    帮助HELP 要实现如WCF中的Help帮助文档,Web API 2 中已经支持很方便的实现了这一特性  http://www.asp.net/web-api/overview/creating-we ...

  9. jeesite笔记

    环境 Github上的不能初始化数据库:https://github.com/thinkgem/jeesite 官网上的可以: http://jeesite.com/ 用 Idea 打开,修改 \sr ...

  10. JSON相关(一):JSON.parse()和JSON.stringify()

    parse用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age":&qu ...