二叉树相关问题处理

105 阅读1分钟

103.二叉树的锯齿形层序遍历

有两种思路,将层序遍历的节点用两个栈保存,分别存在a栈和b栈中,a栈由右往左存,b栈从左往右存。

另外一个更好的思路就是用双端队列deque<int> q来存储,每一轮先从前往后出,再从后往前出,即可锯齿形遍历。用开关值进行判断,正负1切换。

236.二叉树的公共祖先

直接递归dfs,后序遍历从下往上判断cur的情况,如果cur为p或者为q,直接返回cur; 如果left 和 right 都不为空,那么cur就是公共节点,直接返回cur; 如果有一个子节点不为空,那么就说明此子节点下方有p 或者 q, 那么返回子节点就好 。

主要思想就是通过cur为不为空,来判断是不是和他们的公共节点有关。

还可以利用树的hash思想。unordered_map<int,Treenode*> map建立该hash表,记录每个结点值对应的父结点。 然后首先建立set或者map等等,存储所有p节点的父结点(包括p本身) ,然后再找到所有q节点的父结点,判断在不在dads里,在的话直接return q

主要思想是建立hash表,存储p的父结点数组,判断q的父结点在不在里面。