二叉树的前序遍历
采用递归的方式可以很快得到结果,中序遍历和后序遍历与该算法几乎一样,只是有几行代码的位置换一换。
前序遍历: 先保存根节点的值,然后再去遍历左子树,然后遍历右子树。因此,添加结点值的代码在遍历左子树和右子树的结点的上面。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer>list=new ArrayList<>();
if(root==null)
return list;
preorderFunction(root,list);
return list;
}
void preorderFunction(TreeNode root,List<Integer>list){
if(root==null)
return;
list.add(root.val);
preorderFunction(root.left,list);
preorderFunction(root.right,list);
}
}
二叉树的中序遍历
中序遍历,是先要找到二叉树的最左结点,即一直遍历根节点的左子结点,直到某个结点的左子结点为null为止,然后在遍历此节点的右子树,也是按照中序遍历的方式。因此,与前序遍历不同的是,中序遍历一开始便直接到了树的下面,然后才开始将结点的值添加到列表中的。因此添加结点的值的代码,在遍历左子结点的下面。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<>();
if(root==null)
return list;
inorderFunction(root,list);
return list;
}
void inorderFunction(TreeNode root, List<Integer> list){
if(root==null)
return;
inorderFunction(root.left,list);
list.add(root.val);
inorderFunction(root.right,list);
}
}
二叉树的后序遍历
先便利到最左结点,然后遍历该节点的父节点的右子树,最后再将结点的值添加到链表中。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer>list=new ArrayList<>();
if(root==null)
return list;
postorderFunction(root,list);
return list;
}
void postorderFunction(TreeNode root, List<Integer> list){
if(root==null)
return ;
postorderFunction(root.left,list);
postorderFunction(root.right,list);
list.add(root.val);
}
}
二叉树按层次遍历
借助于数据结构—队列。将结点的左右子节点依次存到队列中,按照先进先出的原则,进行出队、入队。两层循环,内面的一层负责本行结点遍历完成,外面的一层负责整棵树遍历完成。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>>ans=new ArrayList<>();
if(root==null)
return ans;
List<TreeNode> queue=new ArrayList<>();
queue.add(root);
TreeNode tempNode=null;
while(!queue.isEmpty()){
int count=queue.size();
List<Integer>list=new ArrayList<>();
for(int i=0;i<count;i++){
tempNode=queue.remove(0);
list.add(tempNode.val);
if(tempNode.left!=null)
queue.add(tempNode.left);
if(tempNode.right!=null)
queue.add(tempNode.right);
}
ans.add(list);
}
return ans;
}
}
之字形打印二叉树
代码:未完待续
在这里插入代码片
来源:CSDN
作者:也想一个人去旅行
链接:https://blog.csdn.net/xiangfeihuanjue/article/details/104647287