标签:node 遍历 Day6 st 二叉树 push null 节点 刷题
热热身,先来几道基础题
144. 二叉树的前序遍历
145. 二叉树的后序遍历
94. 二叉树的中序遍历
三种最基础的二叉树的题目,递归解决
除此之外,所有递归可以解决的问题,栈都可以解决。用栈再重新解决一遍这三个问题.
前序遍历的栈解决很简单,右左中放进栈中,提取出来的结果就是中左右
后序遍历难一点,左右中放进栈,提取出来的结果是中右左,再次反转,就是左右中了
中序遍历最难,需要先把左节点都放进栈中,然后当下一个指针是空的时候,从栈中提取,保存值,这个就是当前最左侧的值,然后再将指针指向其右节点。此时该节点已经不在栈中,不会重复调用,同时其值也已经被记录。若其右子节点也为空,此时它作为它父亲节点的左子节点,已经遍历完成。
还有一种将三种遍历的栈解决的方式统一起来的方法。本质上是标记节点,调用过但是没记录过的节点要进行标记,下次再遇到的时候不要重复加入其左右节点。
class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result = new LinkedList<>(); Stack<TreeNode> st = new Stack<>(); if (root != null) st.push(root); while (!st.empty()) { TreeNode node = st.peek(); if (node != null) { st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中 if (node.right!=null) st.push(node.right); // 添加右节点(空节点不入栈) if (node.left!=null) st.push(node.left); // 添加左节点(空节点不入栈) st.push(node); // 添加中节点 st.push(null); // 中节点访问过,但是还没有处理,加入空节点做为标记。 } else { // 只有遇到空节点的时候,才将下一个节点放进结果集 st.pop(); // 将空节点弹出 node = st.peek(); // 重新取出栈中元素 st.pop(); result.add(node.val); // 加入到结果集 } } return result; } }
class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> result = new LinkedList<>(); Stack<TreeNode> st = new Stack<>(); if (root != null) st.push(root); while (!st.empty()) { TreeNode node = st.peek(); if (node != null) { st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中 if (node.right!=null) st.push(node.right); // 添加右节点(空节点不入栈) st.push(node); // 添加中节点 st.push(null); // 中节点访问过,但是还没有处理,加入空节点做为标记。 if (node.left!=null) st.push(node.left); // 添加左节点(空节点不入栈) } else { // 只有遇到空节点的时候,才将下一个节点放进结果集 st.pop(); // 将空节点弹出 node = st.peek(); // 重新取出栈中元素 st.pop(); result.add(node.val); // 加入到结果集 } } return result; } }
class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> result = new LinkedList<>(); Stack<TreeNode> st = new Stack<>(); if (root != null) st.push(root); while (!st.empty()) { TreeNode node = st.peek(); if (node != null) { st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中 st.push(node); // 添加中节点 st.push(null); // 中节点访问过,但是还没有处理,加入空节点做为标记。 if (node.right!=null) st.push(node.right); // 添加右节点(空节点不入栈) if (node.left!=null) st.push(node.left); // 添加左节点(空节点不入栈) } else { // 只有遇到空节点的时候,才将下一个节点放进结果集 st.pop(); // 将空节点弹出 node = st.peek(); // 重新取出栈中元素 st.pop(); result.add(node.val); // 加入到结果集 } } return result; } }
199. 二叉树的右视图
层序遍历,选这个题的原因是这个题之前面试做过
层序遍历要用队列,这道题比层序遍历多在要把每一层的最后一个节点(也就是最右节点)记录下来。
想起来就很伤心,这题竟然面试的时候没做出来...
226. 翻转二叉树
递归,子节点都反转了之后再反转自己这一层,左变右,右变左。
标签:node,遍历,Day6,st,二叉树,push,null,节点,刷题 来源: https://www.cnblogs.com/wangqianming12138/p/16387904.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。