1.关于二叉树的问题
首先介绍一下二叉树遍历的方式:分为先序遍历(根、左、又)、中序遍历(左、根、右)、后序遍历(左、右、根)
关于二叉树的遍历用java代码实现
(1)使用递归的方式实现二叉树的遍历这是一种最基本的实现方式
public class Node(){
public int value;
public Node left;
public Node right;
public Node(int data){
this.value=data;
}
//先序遍历
public void preOrderRecur(Node head){
if(head==null){
return;
}
System.out.print(head.value+"");
preOrderRecur(head.left);
preOrderRecur(head.right);
}
//中序遍历
public void inOrderRecur(Node head){
if(head==null){
return;
}
inOrderRecur(head.left);
System.out.print(head.value+"");
inOrderRecur(head.right);
}
//后序遍历
public void posOrderRecur(Node head){
if(head==null){
return;
}
posOrderRecur(head.left);
posOrderRecur(head.right);
System.out.print(head.value+"");
}
}
(2)使用非递归的方式实现二叉树(即使用迭代栈的方式来实现)
//先序遍历
public void preOrderRecur(Node head){
System.out.print("pre-order");
if(head !=null){
Stack<Node> stack=new Stack<Node>();
stack.add(head);
while(!stack.isEmpty()){
head=stack.pop();
System.out.print(head.value+"");
if(head.right !=null){
stack.push(head.right);
}
if(head.right !=null){
stack.push(head.left);
}
}
}
System.out.println();
}
//中序遍历
public void inOrderRecur(Node head){
System.out.print(“in-order”);
if(head != null){
Stack<Node> stack=new Stack<Node>();
while(!stack.isEmpty || head !=null){
if(head !=null){
stack.push(head);
head=stack.left;
}else{
head=stack.pop();
System.out.print(head.value+"");
head=head.right;
}
}
}
System.out.println();
}
//后序遍历(用两个栈实现的后序遍历方式)
public void posOrderRecur(Node head){
System.out.print("pos-order");
if(head !=null){
Stack<Node> s1=new Stack<Node>();
Stack<Node> s2=new Stack<Node>();
s1.pop();
while(!s1.isEmpty()){
head=s.pop();
s2.push(head);
if(head.left !=null){
s1.push(head.left);
}
if(head.right !=null){
s1.push(head.right);
}
}
while( !s2.isEmpty()){
System.out.print(s2.pop().value+"");
}
}
System.out.println();
}
//用一个栈实现后序遍历的排序
public void posOrderRecur(Node head){
System.out.print("pos-order");
if(head!=null){
Stack<Node> stack=new Stack<Node>();
stack.push(head);
Node c=null;
while(!stack.isEmpty()){
c=stack.peek();
if(c.left !=null&& head!=c.left && head !=c.right){
stack.push(c.left);
}else if(c.right !=null && head !=c.right){
stack.push(c.right);
}else{
System.out.print(stack.pop().value+"");
head=c;
}
}
}
System.out.println();
}
(3)遍历二叉树的神级方法(本质上用的是Morris遍历):二叉树的节点为N时间复杂度为O(N),额度空间复杂度为O(1)
public class Node(){
public int value;
public Node left;
public Node right;
public Node(int data){
this.value=data;
}
//先序遍历
public void morrisIn(Node head){
if(head==null){
return;
}
Node cur1=head;
Node cur2=null;
while(cur1 !=null){
cur2=cur1.left;
if(cur2!=null){
while(cur2.right !=null && cur2.right !=cur1){
cur2=cur2.right;
}
if(cur2.right==null){
cur2.right=cur1;
cur1=cur1.left;
continue;
}else {
cur2.right=null;
}
System.out.print(cur1.value+"");
cur1=cur1.right;
}
System.out.println();
}
}
//中序遍历
public void morrisPre(Node head){
if(head==null){
return;
}
Node cur1=head;
Node cur2=null;
while(cur1 !=null){
cur2=cur1.left;
if(cur2 !=null){
while(cur2.right !=null && cur2.right !=cur1){
cur2=cur2..right;
}
if(cur2.right ==null){
cur2.right=cur1;
System.out.print(cur1.value+"");
cur1=cur1.left;
continue;
}else {
cur2.right=null;
}
}else {
System.out.print(cur1.value+"");
}
cur1=cur1.right;
}
System.out.println();
}
//后序遍历
public void morrisPos(Node head){
if(head==null){
return;
}
Node cur1=head;
Node cur2=null;
while(cur1 !=null){
cur2=cur1.left;
if(cur2 !=null){
while(cur2.right !=null && cur2.right !=cur1){
cur2=cur2.right;
}
if(cur2.right==null){
cur2.right=cur1;
cur1=cur1.left;
continue;
}else{
cur2.right=null;
printEdge(cur1.left);
}
}
cur1=cur1.right;
}
printEdge(head);
System.out.println();
}
public void printEdge(Node head){
Node tail=reverseEdge(head);
Node cur=tail;
while(cur !=null){
System.out.print(cur.value+"");
cur=cur.right;
}
reverseEdge(tail);
}
public Node reverseEdge(Node from){
Node pre=null;
Node next=null;
while(from !=null){
next=from.right;
from.night=pre;
pre=from;
from=next;
}
return pre;
}