自己做免费的网站吗,wordpress导航标签文件在哪,wordpress 博客编辑,福建省住房和城乡建设厅网站前言 本文是跟着代码随想录的栈与队列顺序进行刷题并编写的 代码随想录 好久没刷算法了#xff0c;最近又开始继续刷#xff0c;果然还是要坚持。 二叉树的题目比之前多了好多#xff0c;就多分几次写啦~ 这是力扣刷算法的其他文章链接#xff1a;刷算法Leetcode文章汇总
…前言 本文是跟着代码随想录的栈与队列顺序进行刷题并编写的 代码随想录 好久没刷算法了最近又开始继续刷果然还是要坚持。 二叉树的题目比之前多了好多就多分几次写啦~ 这是力扣刷算法的其他文章链接刷算法Leetcode文章汇总
二叉树篇前中后序遍历
1144.二叉树的前序遍历 ①递归先加入当前节点值再递归左右子节点 ②栈迭代先获取当前节点值注意右节点先入栈左节点后入栈 ③栈迭代从根开始遍历左节点取值并入栈再取栈顶右节点重复 ④Morris遍历将左节点的最右节点即p2右指针指向根不使用额外空间实现左子树遍历完后就回到根遍历右子树。若p2右指针为空代表该树即p1的左子树未遍历 核心思想添加根p1的值即为中遍历左节点左不空就添加指向根的指针并继续往左左空就添加该节点值即为左并找右节点若右节点不为根就作为新子树遍历即为右若为根就回到之前的树遍历右节点并添加
class Solution {private ListInteger res;public ListInteger preorderTraversal(TreeNode root) {res new ArrayList();TreeNode p1 root, p2 new TreeNode();while(p1!null){if(p1.leftnull){res.add(p1.val);p1p1.right;}else{p2p1.left;while(p2.right!nullp2.right!p1){p2p2.right;}if(p2.rightnull){p2.rightp1;res.add(p1.val);p1p1.left;}else{p2.rightnull;p1p1.right;}}}return res;}
} 2145.二叉树的后序遍历 ①递归先递归左右子节点再加入当前节点值 ②栈迭代取栈头左右节点依次入栈栈头值头插到结果 ③Morris遍历核心思路还是创建一个右子树最后一个节点到根的指针由于根节点最后添加要实现一个左节点到最右节点添加的方法 核心思想从根p1开始左不空就添加指向根的指针并继续往左左空就添加即为左并遍历右节点右不为根就作为新树遍历左节点右为p1就代表所有左节点遍历完将p1左节点到p2的节点逆序添加即为右中注意最后要将根到整棵树最右节点的路径逆序添加
class Solution {private ListInteger res;public ListInteger postorderTraversal(TreeNode root) {res new ArrayList();TreeNode p1root,p2null;while(p1!null){if(p1.leftnull){p1p1.right;}else{p2p1.left;while(p2.right!nullp2.right!p1){p2p2.right;}if(p2.rightnull){p2.rightp1;p1p1.left;}else{p2.rightnull;addRightPath(p1.left);p1p1.right;}}}addRightPath(root);return res;}private void addRightPath(TreeNode node){int p res.size();while(node!null){res.add(p,node.val);nodenode.right;}}
} 394.二叉树的中序遍历 ①递归先递归左子树再加入当前节点值再递归右子树 ②栈迭代一直找到最左节点并依次入栈此时栈顶值加入结果并将右节点作为当前节点当栈或当前节点都不空时进行循环注意是或 注意由于中序遍历要将根节点记录的中间没办法像前序或后序实现简洁的迭代必须先将左子树遍历完 ③Morris遍历与之前遍历思路同创建一个右子树最后一个节点到根的指针。先将左子树遍历完即左后再添加根节点即中再遍历右子树即右。
class Solution {private ListInteger res;public ListInteger inorderTraversal(TreeNode root) {res new ArrayList();TreeNode p1root,p2null;while(p1!null){if(p1.leftnull){res.add(p1.val);p1p1.right;}else{p2p1.left;while(p2.right!nullp2.right!p1){p2p2.right;}if(p2.rightnull){p2.rightp1;p1p1.left;}else{p2.rightnull;res.add(p1.val);p1p1.right;}}}return res;}
}
二叉树篇前中后序遍历总结 ①区分三种遍历顺序前序根左右中序左根右后序左右根指的是根的位置 ②都有递归实现的方法代码简洁易懂只用注意根添加和左右子树递归的顺序即可 ③都有迭代实现的方式需要显式栈辅助。都可以先将左子树全遍历完再遍历右子树需要两层while。其中前序和后序有较简洁的迭代每次将左右节点按特定顺序入栈即可而中序遍历一定要先遍历完左子树才行 ④都有Morris遍历特点在于将左节点的最右节点右指针指向根节点从而实现左子树遍历完后回到根节点遍历右子树节点添加顺序有不同。特别是后序遍历对最右路径节点的单独添加最好自己调试一遍更容易理解 ⑤一般来说能用递归实现就能用栈实现因为递归是隐式栈 ⑥代码随想录中有一种二叉树的统一迭代法对前中后序的迭代遍历使用几乎相同的算法只修改栈的添加顺序感兴趣可以看一下我记不下来就没看