在二叉树方面停留了好长一段时间,各种资料:维基百科的定义、csdn的博客,java的api使用方法视频,最近突然发现我对数据结构的理解似乎开始有点质变的现象啦,开始能自己写出完整正确的代码啦,欣喜中,再接再厉,为自己加油!今天来贴一段二叉树递归实现先序遍历的完整代码。
leetcode原题地址:https://oj.leetcode.com/problems/binary-tree-preorder-traversal/
解题思路:
题目虽然是建议不用递归算法,因目前还没开始学习迭代的算法思想,所以先暂时用递归思想来解。
要实现先序遍历,所以完整程序包含如下几点
1、创建二叉树 public void createBinaryTree(TreeNode root){}
2、二叉树是由结点构成的(即TreeNode),所以创建个TreeNode 类,即 public class TreeNode{}
3、从维基百科里了解到二叉树结点通常通过数组或者线性表来存储,我这里采用数组来存储结点,即ArrayList<Integer>,所以开头要import java.util.ArrayList;
4、前3个步骤完成之后,现在可以创建先序遍历方法啦,刚刚第3步说用ArrayList来存储二叉树结点,所以这么写先序遍历方法 public ArrayList<Integer> inordertraversal(TreeNode root){},该方法内的思想要体现出先序遍历的逻辑:访问根节点--》访问左孩子--》访问右孩子
package tree;
import java.util.ArrayList;
public class Preorder_traversal {
private TreeNode root = null;
private ArrayList<Integer> res;
public Preorder_traversal(){
root = new TreeNode(1,1);
}
//创建二叉树
public void createBinaryTree(TreeNode root){
TreeNode newNodeB = new TreeNode(2,2);
TreeNode newNodeC = new TreeNode(3,3);
root.rightChild = newNodeB;
root.rightChild.leftChild = newNodeC;
}
//二叉树由结点构成,所以需要创建TreeNode类
public class TreeNode{
private int key = 0;
private int data = 0;
private TreeNode leftChild = null;
private TreeNode rightChild = null;
public TreeNode(int key,int data){
this.key = key;
this.data = data;
this.leftChild = null;
this.rightChild = null;
}
}
//二叉树结点通常用数组或线性表进行存储,这里选择使用数组ArrayList才存储
public ArrayList<Integer> preorder_Traversal(TreeNode root){
res = new ArrayList<Integer>();
helper(root,res);
return res;
}
public void helper(TreeNode root,ArrayList<Integer> res){
if (root == null)
return ;
else {
//helper(root,res);
res.add(root.data);
helper(root.leftChild,res);
helper(root.rightChild,res);
}
}
public static void main(String[] args){
Preorder_traversal bt = new Preorder_traversal();
bt.createBinaryTree(bt.root);
bt.preorder_Traversal(bt.root);
int count = bt.res.size();
for (int i=0;i<count;i++){
System.out.print(bt.res.get(i)+" ");
}
}
}
打印结果如下:
1 2 3