三个遍历的博客地址,
1)
即:
前序遍历,总是先访问当前节点,再左子,最后右子
中序遍历,总是先访问左子,再当前节点,最后右子
后序遍历,总是先访问左子,再右子,最后当前节点
关于三大基础遍历,必须要条件反射式的记住:三种遍历的迭代方式使用的都是栈,后序遍历必须使用了两个栈,其余乱七八糟的解决方式统统就不要再记了。
三道中序遍历题目:
1)
分析:
102题目的意思是每一层均按照从左到右的顺序遍历节点,并记录节点到vector中。显然广度优先搜索,用队列。
利用两个队列保存当层的节点与下一层的节点,下一层的元素处理完后,
下一层成为当层(继续获取下一层的节点)。
107题目道理是一样的,不过就是插入vector的顺序逆着来而已,不过这样做似乎没有达到考察的目的!
2)
这个问题和上面的题目基本一样,唯一的区别就是奇数层和偶数层的压入顺序相反而已,但是通过vector插入顺序的不同来达到目的似乎并没有达到题目的考察目的。
102/103/107三个题目,都是按照广度优先遍历二叉树,其实主要用到数据结构队列。算法这里不细说了,可以直接看文章中的代码。
显然,中序遍历必须要条件反射的是,务必使用数据结构队列。
分析:
首先要弄清楚什么是前序遍历和中序遍历,后续遍历?
前序遍历就是先遍历当前的节点,然后遍历该节点的左分支(即遍历左分支的所有节点),最后再遍历该节点的右分支。
中序遍历是先遍历当前节点的左分支,再遍历当前节点,最后遍历当前节点的右分支。
还有后序遍历,就是先左分支,再右分支,最后当前节点。
以下面的二叉树为例。
4
/ \
2 7
/ \ / \
1 3 6 9
其先序遍历结果:【4 2 1 3 7 6 9】
中序遍历结果是:【1 2 3 4 6 7 9】
后序遍历结果是:【1 3 2 6 9 7 4】
对先序遍历来说:
先序遍历的每个值表示的结点都是接下来的若干个结点(根据中序遍历即确定)的父结点。
比如【4】是这个二叉树的根结点,【2】是【1 3】的父结点,【1】是 空的父结点,也即使叶子结点。
对中序遍历来说:
根结点(根据前序遍历即确定)一定在中间位置,该位置左边是其左子树,右边是其右子树。
比如【4】左边【1 2 3】全是根结点的左子树,右边是【6 7 9】是根结点的右子树。
对于【2】来说,【1】是其左子树,【3】是其右子树。
对后序遍历来说:
后序遍历的末尾结点都是前面的若干个结点(根据中序遍历即可确定)的父结点。
比如【4】是这个二叉树的根结点,【2】是【1 3】的父结点,【7】是【4 6】的父结点,
博文地址:
1)判断一颗二叉树是否平衡,
2)根据有序链表和数组构造二叉搜索树,
有序数组或者链表转化成二叉搜索树。思路还是比较明显的!因为有序,为了能平衡,总是选择数组或者(未被使用过的位置的)中间位置的值作为当前二叉树的根节点!显然对于链表来说就是使用快慢指针法来找到中间位置。
见博文:
1)符合要求的二叉搜索树有多少种?,
这个问题实际上是动态规划问题,所以必须努力去找到和以前的子问题的联系。
断言:由1,2,3,...,n构建的二叉查找树,以i为根节点,左子树由[1,i-1]构成,其右子树由[i+1,n]构成。
定义子问题:定义f(i)为以[1,i]能产生的二叉搜索树的数目
若数组为空,则只有一种BST,即空树,f(0)=1;
若数组仅有一个元素1,单个节点,f(1)=1;
若数组有两个元素1,2,则有两种可能,f(2)=2;
若数组有三个元素1,2,3,则有5中情况,题目已经说了,
n=4呢?显示此问题玄机的时候到了:寻找与上面已推出子问题的关系:
如果1为根,则左子树0个元素所以1种情况,右子树3个元素(2,3,4),显然为5种情况
如果2为根,则左子树1个元素所以1种情况,右子树2个元素(3,4),显然为2
如果3为根,则左子树2个元素所以2种情况,右子树1个元素(4),显然为1
如果4为根,则左子树3个元素所以5种情况,右子树3个元素(无),显然为1
由此可以得到递推公式:f(i)=f(0)*f(i-1)+...+f(k-1)*f(i-k)+...+f(i-1)*f(0)
2,Unique Binary Search Trees II
博文如下:
1)反转二叉树,
2)二叉树是否镜像对称?,
3)将二叉树碾平成单链表,
4)右视二叉树的结果,
1)
注意:本题给定的两个节点一定在这个二叉搜索树上,所以一定存在最低公共祖先。
如果当前节点r是q和p的祖先,一定满足如下条件:
1)p和q分居两颗子树
2)p和q中有一个就是当前节点,另一个居于某颗子树
那么其他情况呢?
3)p和q都在左子树或者右子树
而根据二叉搜索树的规则,我们可以通过比较三个节点的大小来判断谁在谁的那一边
Given a binary tree containing digits from 0-9
only, each root-to-leaf path could represent a number.
An example is the root-to-leaf path 1->2->3
which represents the number 123
.
Find the total sum of all root-to-leaf numbers.
For example,
1 / \ 2 3
The root-to-leaf path 1->2
represents the number 12
.
The root-to-leaf path 1->3
represents the number 13
.
Return the sum = 12 + 13 = 25
.
分析:DONE
深度优先搜索!累加当前节点的值,一旦遇到叶子就加到sum里,最后统计出总和!
Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.
For example:
Given the following binary tree,
1 <--- / \ 2 3 <--- \ \ 5 4 <---
You should return [1, 3, 4]
.
分析:
典型的广度优先遍历,每一层的最右边那个元素显然就是当层的右视可见节点!
参考资源:
【1】http://blog.csdn.net/loverooney/article/details/32340299
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/51488374
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895