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

二叉树节点定义如下:

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. 浅谈Android 6.0之Runtime Permissions

    前言 Android6.0发布后,其一系列新特新足够让我们这些Android程序员兴奋一段时间了.首先我们先看看具体有哪些新特性: -锁频下语音搜索 -指纹识别 -更完整的应用权限管理 -Doze电量 ...

  2. linux 下 jdk+tomcat+mysql 的 jsp 环境搭建

    JDK 在 linux 下安装 1.          把安装文件放在 /opt 下,并执行 [root@localhost opt]# ./jdk-1_5_0_06-linux-i586.bin 并 ...

  3. p1304 家族

    描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲戚 ...

  4. 去哪儿网mysql语法审核工具Inception正式开源

    Inception不仅仅是一个自动化审核工具,同时还具备执行SQL,并且生成对影响数据的回滚语句(类似于闪回的功能),这样一条龙便捷服务的工具.

  5. 5.4-5.8webstorm css

    关于使用css3 动画完成牛顿摆球效果: 使用的规则为@keyframes,不过目前的浏览器都不支持该规则. Firefox 支持替代的 @-moz-keyframes 规则. Opera 支持替代的 ...

  6. NABC模型进行需求分析

    N(需求): 图书租售管理系统.图书租售管理系统必须包含有完善的图书出租功能.还租.预订(租).会员管理.积分管理.简单的财务系统.详细分类统计.各数据排行榜.详细权限管理. A(做法): 因为有一些 ...

  7. [游戏学习22] MFC 井字棋 双人对战

    >_<:太多啦,感觉用英语说的太慢啦,没想到一年做的东西竟然这么多.....接下来要加速啦! >_<:注意这里必须用MFC和前面的Win32不一样啦! >_<:这也 ...

  8. JPA oneToMany 级联更新

    oneToMany 使用: 示例:Employee与Phone为例. 1.类定义如下: package com.vrvwh.wh01.domain; import javax.persistence. ...

  9. jQuery的XX如何实现?——4.类型检查

    往期回顾: jQuery的XX如何实现?——1.框架 jQuery的XX如何实现?——2.show与链式调用 jQuery的XX如何实现?——3.data与cache机制 -------------- ...

  10. 1120练习,CSS制作网页

    <title>智博星主页</title> <style type="text/css"> *{ margin:0px auto; padding ...