题目: 给定一数组,判断它是否为二叉查找树的后序遍历数组 思路: 想想,二叉查找数树的特点,任意根结点大于左子树的所有值,而小于右子树的所有值; 再想想,后序遍历的特点,先遍历左子树,再遍历右子树,最后是根结点; 因此很…
分类:树相关算法
(剑指Offer)面试题61:按之字形顺序打印二叉树
题目: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 思路: 按照广度优先遍历来遍历二叉树,但是需要按照之字形来打印,意…
(剑指Offer)面试题60:把二叉树打印成多行
题目: 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 思路: 很明显,采用广度优先遍历来解决,但因为需要按行输出,所以需要判断每一层的开始和结束,因此需要两个变量,一个表示当前层尚未打印的结点数,一个…
(剑指Offer)面试题59:对称的二叉树
题目: 请实现一个函数,用来判断一颗二叉树是不是对称的。 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 思路: 对于一棵二叉树,从根结点开始遍历, 如果左右子结点有一个为NULL,那么肯定不是对称二叉树…
(剑指Offer)面试题58:二叉树的下一个结点
题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 思路: 考虑中序遍历的过程, 如果当前结点存在右子节点,那么当前结点的下一个…
(算法)二叉树的第m层第k个节点
题目: 给定以下二叉树: struct node { node *left, *right; int value; }; 要…
(剑指Offer)面试题50:树中两个结点的最低公共祖先
题目: 求树中两个结点的最低公共祖先 思路: 考虑一下几种情况: 1、该树为二叉搜索树 二叉搜索树是排序树,位于左子树点的结点都比父结点小,而位于右子树的结点都比父结点大,只需要从树的根结点开始和两个输入的结点进行比较。…
(剑指Offer)面试题39:判断平衡二叉树
题目: 输入一课二叉树的根结点,判断该树是不是平衡二叉树。如果二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 思路: 1、重复遍历结点 参考上一题求二叉树的深度,先求出根结点的左右子树的深度,然…
(剑指Offer)面试题39:二叉树的深度
题目: 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 结点的定义如下: struct TreeNode{ int val; TreeNode* …
(剑指Offer)面试题25:二叉树中和为某一值的路径
题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 二叉树结点的定义: struct TreeNode{ int val;…
(剑指Offer)面试题27:二叉搜索树与双向链表
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 二叉树的定义如下: struct TreeNode{ int val; TreeNode* le…
(剑指Offer)面试题24:二叉搜索树的后序遍历序列
题目: 输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历的结果,如果是则返回true,否则返回false。 假设输入的数组的任意两个数字都互不相同。 思路: 根据二叉搜索树的后序遍历特点,很容易可以判断该数组是…