二叉树的三种遍历方法,及树结点的删除(java源代码)

  • 满二叉树和完全二叉树的区别
    /
    /

  • 前序遍历,中序遍历,后序遍历。是相对于父结点来说的
    /
    public class Main {
    public static void main(String[] args) {
    Node node1=new Node(1, “刘备”);
    Node node2=new Node(2, “关羽”);
    Node node3=new Node(3, “张飞”);
    Node node4=new Node(4, “赵云”);
    Node node5=new Node(5, “黄忠”);
    Node node6=new Node(6, “马超”);
    Tree tree=new Tree(node1);
    node1.left=node2;
    node1.right=node3;
    node3.left=node4;
    node3.right=node6;
    node4.right=node5;
    /

    System.out.println(“中序遍历的结果为:”);
    tree.preorder(node1);
    System.out.println(“中序遍历的结果为:”);
    tree.inorder(node1);
    System.out.println(“后序遍历的结果为:”);
    tree.postorder(node1);
    Node node=tree.preorderSearch(6, node1);//查找id为6发结点
    if(node==null) {
    System.out.println(“未找到该结点”);
    }else {
    System.out.println(“该结点为”+node.toString());
    }
    */
    tree.deleteNode(3, node1);
    }
    }
    //结点
    class Node{
    public int id;
    public String name;
    Node left;
    Node right;

    public Node(int id, String name) {
    super();
    this.id = id;
    this.name = name;
    }

    @Override
    public String toString() {
    return “Node [id=” + id + “, name=” + name + “]”;
    }
    }

class Tree{
public Node root;

public Tree(Node root) {
	super();
	this.root = root;
}
//前序序遍历。先父结点,然后左结点,然后右结点
public void preorder(Node root) {
	System.out.println(root.toString());
	if(root.left!=null) {
		preorder(root.left);
	}
	if(root.right!=null) {
		preorder(root.right);
	}
}
//中序遍历。先左节点,再父结点,再右结点
public void inorder(Node root) {
	if(root.left!=null) {
		inorder(root.left);
	}
	System.out.println(root.toString());
	if(root.right!=null) {
		inorder(root.right);
	}
}
//后序遍历。先左结点,再右结点,再父结点
public void postorder(Node root) {
	if(root.left!=null) {
		postorder(root.left);
	}
	if(root.right!=null) {
		postorder(root.right);
	}
	System.out.println(root.toString());
}
//前序遍历查找
public Node preorderSearch(int id,Node root) {
	if(root.id==id) {
		return root;
	}
	Node temp=null;
	if(root.left!=null) {
		temp=preorderSearch(id, root.left);
	}
	if(temp!=null) {
		return temp;
	}
	if(root.right!=null) {
		temp=preorderSearch(id, root.right);
	}
	return temp;	
}
public void deleteNode(int id,Node root) {
	if(root.id==id) {
		root=null;
		System.out.println("删除成功");
	}else {
		if(delete(id, root)) {
			System.out.println("删除成功");
		}else {
			System.out.println("该结点不存在");
		}
	}
	preorder(root);
}
public boolean delete(int id,Node root) {
	if(root.left!=null&&root.left.id==id) {
		root.left=null;
		return true;
	}
	if(root.right!=null&&root.right.id==id) {
		root.right=null;
		return true;
	}
	if(root.left!=null) {
		delete(id, root.left);
	}
	if(root.right!=null) {
		delete(id, root.right);
	}
	return false;
}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值