代码随想录算法训练营二十四期第十四天

编程入门 行业动态 更新时间:2024-10-28 09:16:22

代码随想录算法训练营<a href=https://www.elefans.com/category/jswz/34/1766924.html style=二十四期第十四天"/>

代码随想录算法训练营二十四期第十四天

递归前中后序遍历很简单!只需要注意当前节点的取出顺序就可以了。
迭代法的前中后序遍历较难,
题目链接:

前序遍历

递归遍历:

class Solution {public void preTravel(List<Integer>list,TreeNode root) {if(root == null) return;list.add(root.val);preTravel(list, root.left);preTravel(list, root.right);}public List<Integer> preorderTraversal(TreeNode root) {List<Integer>list = new ArrayList<>();preTravel(list, root);return list;}
}

迭代遍历:(利用栈来实现)

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer>list = new ArrayList<>();Stack<TreeNode>stack = new Stack<>();if(root == null) return list;stack.push(root);while(!stack.empty()) {TreeNode node = stack.peek();if(node != null) {stack.pop();//现将中间节点弹出if(node.right != null) stack.push(node.right);//如果右右子节点,将右子节点插入栈中if(node.left != null) stack.push(node.left);//如果有左子结点,将左子结点插入栈中stack.push(node);//插入中间节点stack.push(null);//中间结点访问过,但是还没处理,添加一个空节点对其进行标记}else {stack.pop();//将空节点删除node = stack.peek();stack.pop();//取出栈顶元素list.add(node.val);//放到结果集}}return list;}
}

中序遍历

递归遍历:

class Solution {public void inTravel(List<Integer>list, TreeNode root) {if(root == null) return;inTravel(list, root.left);list.add(root.val);inTravel(list,root.right);}public List<Integer> inorderTraversal(TreeNode root) {List<Integer>list = new ArrayList<>();inTravel(list, root);return list;}
}

迭代遍历:

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer>list = new ArrayList<>();Stack<TreeNode>stack = new Stack<>();if(root == null) return list;stack.push(root);while(!stack.isEmpty()) {TreeNode node = stack.peek();if(node != null) {stack.pop();if(node.right != null) stack.push(node.right);//添加右节点,空节点不入栈stack.push(node);//添加中间节点stack.push(null); //中间结点访问过但还没处理,添加空节点做标记if(node.left != null) stack.push(node.left);//添加左节点,空节点不入栈}else {stack.pop();//将空节点弹出node = stack.pop();//取出栈中元素list.add(node.val);//放入结果集}}return list;}

后序遍历

递归遍历:

class Solution {public void postTravel(List<Integer>list,TreeNode root) {if(root == null) return;postTravel(list, root.left);postTravel(list, root.right);list.add(root.val);}public List<Integer> postorderTraversal(TreeNode root) {List<Integer>list = new ArrayList<>();postTravel(list, root);return list;}
}

迭代遍历:

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer>list = new ArrayList<>();Stack<TreeNode>stack = new Stack<>();if(root == null) return list;stack.push(root);while(!stack.isEmpty()) {TreeNode node = stack.peek();if(node != null) {stack.push(null);//访问过中间结点,但还没处理,添加空节点,对中间节点做标记if(node.right != null) stack.push(node.right);//添加右子节点if(node.left != null) stack.push(node.left);//添加左子结点}else {stack.pop();node = stack.pop();list.add(node.val);}}return list;}
}

总结

二叉树的递归法遍历是比较简单的,而且速度很快。迭代法遍历比较难,而且速度较慢。

更多推荐

代码随想录算法训练营二十四期第十四天

本文发布于:2023-12-03 21:48:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1658047.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:二十   算法   训练营   四期   代码

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!