声明TreeNode节点类
class TreeNode{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val){
this.val = val;
}
}
将要构建的二叉树形态。
1
// * / \
// * 2 4
// * / \ / \
// * 0 3 0 0
构建二叉树
public static void main(String[] args) {
// 实现方式2:
Integer[] arr = {1,2,null,3,null,null,4,null,null};
LinkedList<Integer> list = new LinkedList<>();
for (int i=0;i< arr.length;i++){
list.add(arr[i]);
}
TreeNode binTree = createBinTree2(list);//
}
/**
* 构建二叉树 实现2
* @param list 输入序列
* @return
*/
public static TreeNode createBinTree2(LinkedList<Integer> list){
TreeNode node = null;
if(list == null || list.isEmpty()){
return null;
}
Integer data = list.removeFirst();
if(data!=null){
node = new TreeNode(data);
node.left = createBinTree2(list);
node.right = createBinTree2(list);
}
return node;
}
递归遍历二叉树
- 前序递归遍历
public static void preOrderTraveral(TreeNode node){
if(node == null){
return;
}
System.out.print(node.val+" ");
preOrderTraveral(node.left);
preOrderTraveral(node.right);
}
- 中序递归遍历
public static void inOrderTraveral(TreeNode node){
if(node == null){
return;
}
inOrderTraveral(node.left);
System.out.print(node.val+" ");
inOrderTraveral(node.right);
}
- 后序递归遍历
public static void postOrderTraveral(TreeNode node){
if(node == null){
return;
}
postOrderTraveral(node.left);
postOrderTraveral(node.right);
System.out.print(node.val+" ");
}
运行结果:
与我们构建的二叉树形态相同。
二叉树的非递归遍历:
前序:
public static void preOrderTraveralWithStack(TreeNode node){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode treeNode = node;
while(treeNode!=null || !stack.isEmpty()){
//迭代访问节点的左孩子,并入栈
while(treeNode != null){
System.out.print(treeNode.data+" ");
stack.push(treeNode);
treeNode = treeNode.leftChild;
}
//如果节点没有左孩子,则弹出栈顶节点,访问节点右孩子
if(!stack.isEmpty()){
treeNode = stack.pop();
treeNode = treeNode.rightChild;
}
}
}
中序
public static void inOrderTraveralWithStack(TreeNode node){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode treeNode = node;
while(treeNode!=null || !stack.isEmpty()){
while(treeNode != null){
stack.push(treeNode);
treeNode = treeNode.leftChild;
}
if(!stack.isEmpty()){
treeNode = stack.pop();
System.out.print(treeNode.data+" ");
treeNode = treeNode.rightChild;
}
}
}
后序
public static void postOrderTraveralWithStack(TreeNode node){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode treeNode = node;
TreeNode lastVisit = null; //标记每次遍历最后一次访问的节点
while(treeNode!=null || !stack.isEmpty()){//节点不为空,结点入栈,并且指向下一个左孩子
while(treeNode!=null){
stack.push(treeNode);
treeNode = treeNode.leftChild;
}
//栈不为空
if(!stack.isEmpty()){
//出栈
treeNode = stack.pop();
/**
* 这块就是判断treeNode是否有右孩子,
* 如果没有输出treeNode.data,让lastVisit指向treeNode,并让treeNode为空
* 如果有右孩子,将当前节点继续入栈,treeNode指向它的右孩子,继续重复循环
*/
if(treeNode.rightChild == null || treeNode.rightChild == lastVisit) {
System.out.print(treeNode.data + " ");
lastVisit = treeNode;
treeNode = null;
}else{
stack.push(treeNode);
treeNode = treeNode.rightChild;
}
}
}
}
层序
public static void levelOrder(TreeNode root){
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
root = queue.pop();
System.out.print(root.data+" ");
if(root.leftChild!=null) queue.add(root.leftChild);
if(root.rightChild!=null) queue.add(root.rightChild);
}
}