此时:需要把当前节点看做是它的子节点的父节点来进行理解;
前序遍历的输出:1,2,3,5,4
中序遍历的输出:2,1,5,3,4
后序遍历的输出:2,5,4,3,1
1.实现二叉树的前序,中序,后序遍历
1.1首先实现每个节点的前,中,后序遍历
//定义节点
class HeroNode{
private int no;
private String name;
private HeroNode left;
private HeroNode right;
public HeroNode(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
省略get,set方法。
前序遍历
public void preOrder(){
System.out.println(this); //先输出父节点
//递归想左子树前向遍历
if(this.left!=null){
this.left.preOrder();
}
//递归向右子树前向遍历
if(this.right!=null){
this.right.preOrder();
}
}
中序遍历
public void infixOrder(){
if(this.left!=null){
this.left.infixOrder();
}
System.out.println(this);
if(this.right!=null){
this.right.infixOrder();
}
}
后序遍历
public void postOrder(){
if(this.left!=null){
this.left.postOrder();
}
if(this.right!=null){
this.right.postOrder();
}
System.out.println(this);
}
}
实现节点的前序,中序,后序遍历查找:
/***
*前序遍历查找
*/
public HeroNode preOrdersearch(int no) {
if (this.no == no) {
return this;
}
HeroNode resNode =null;
if (this.left != null) {
resNode = this.left.preOrdersearch(no);
}
if(resNode!=null){
return resNode;
}
if (this.right != null) {
resNode = this.right.preOrdersearch(no);
}
return resNode;
}
/**
* 中序遍历查找
* @param no
* @return
*/
public HeroNode infixOrdersearch(int no){
HeroNode resNode =null;
if(this.left!=null){
resNode =this.left.infixOrdersearch(no);
}
if(resNode!=null){
return resNode;
}
if(this.no ==no){
return this;
}
if(this.right!=null){
resNode= this.right.infixOrdersearch(no);
}
return resNode;
}
/**
* 后序遍历查找
* @param no
* @return
*/
public HeroNode postOrdersearch(int no){
HeroNode resNode =null;
if(this.left!=null){
resNode = this.left.postOrdersearch(no);
}
if(resNode!=null){
return resNode;
}
if(this.right!=null){
resNode =this.right.postOrdersearch(no);
}
if(resNode!=null){
return resNode;
}
if(this.no==no){
return this;
}
return resNode;
}
1.2再定义二叉树,在二叉树中实现前,中,后序遍历,和查找。
//定义二叉树
class BinaryTree{
private HeroNode root;
public void setRoot(HeroNode root) {
this.root = root;
}
//前序遍历
public void preOrder(){
if(this.root!=null){
this.root.preOrder();
}else{
System.out.println("二叉树为空, 无法遍历");
}
}
//中序遍历
public void infixOrder(){
if(this.root!=null){
this.root.infixOrder();
}else{
System.out.println("二叉树为空,无法遍历");
}
}
//后序遍历
public void postOrder(){
if(this.root!=null){
this.root.postOrder();
}else{
System.out.println("二叉树为空,无法遍历");
}
}
//前序查找
public HeroNode preOrderSearch(int no){
if(root!=null){
return root.preOrdersearch(no);
}else{
return null;
}
}
//中序查找
public HeroNode infixOrderSearch(int no){
if(root!=null){
return root.infixOrdersearch(no);
}else{
return null;
}
}
//后序查找
public HeroNode postOrderSearch(int no){
if(root!=null){
return root.postOrdersearch(no);
}else{
return null;
}
}
}
2.实现二叉树的节点删除:
- 因为二叉树是单向的,所以我们判断当前节点的子结点是否是需要删除的结点,而不能去判断当前这个结点是不是需要删除结点。
public void delNode(int no){
if(this.left!=null&&this.left.no==no){
this.left=null;
return;
}
if(this.right!=null&&this.right.no==no){
this.right=null;
return;
}
if(this.left!=null){
this.left.delNode(no);
}
if(this.right!=null){
this.right.delNode(no);
}
}