Java面试宝典——求二叉树中结点的最大距离

结点的距离:是指这两个结点之间边的个数。

一般而言,对二叉树的操作通过递归方法比较容易实现。求最大距离的思想如下:

首先,求左子树距根结点的最大距离,记为leftMaxDistance;

其次,求右子树距根结点的最大距离,记为rightMaxDistance;

那么二叉树中结点的最大距离maxDistance满足maxDistance=leftMaxDistance+rightMaxDistance。

package tt;


/** 
 * @author wyl
 * @time 2018年7月9日上午7:42:46
 */
public class BinaryTree {

	private Node root;
	public BinaryTree() {
		root=null;
	}
	
	/**
	 * 构建二叉树
	 */
	public void buildTree(int[] data){
		for(int i=0;i<data.length;i++){
			insert(data[i]);
		}
	}
	/*
	 * 将data插入到二叉树中
	 * 1.构建结点
	 * 2.寻找插入的位置
	 */
	public void insert(int data){
		Node newNode=new Node(data);
		if (root==null) {//根节点为空,空树,新插入的结点即为根结点
			root=newNode;
		}else {//树不为空,找到要插入的位置
			Node curNode=root;
			Node parent=null;
			while(true){
				parent=curNode;
				if (data<curNode.data) {//左子树
					curNode=curNode.left;
					if (curNode==null) {
						parent.left=newNode;
						return;
					}
				}else {//右子树
					curNode=curNode.right;
					if (curNode==null) {
						parent.right=newNode;
						return;
					}
				}
			}
		}
		
	}
	
	/**
	 * 后序遍历
	 */
	public void postOrder(){
		this.postOrder(this.root);
	}
	public void postOrder(Node localRoot){
		if (localRoot!=null) {
			postOrder(localRoot.left);
			postOrder(localRoot.right);
			System.out.print(localRoot.data+" ");
		}
	}
	
	private int maxLen=0;
	private int max(int a,int b){
		return a>b?a:b;
	}
	
	public void FindMaxDistance(){
		this.FindMaxDistance(this.root);
	}
	public void FindMaxDistance(Node root){
		if (root==null) {
			return;
		}
		if (root.left==null) {
			root.leftMaxDistance=0;
		}
		if (root.right==null) {
			root.rightMaxDistance=0;
		}
		if (root.left!=null) {
			FindMaxDistance(root.left);
		}
		if (root.right!=null) {
			FindMaxDistance(root.right);
		}
		/**
		 * 计算左右子树离根结点的最大距离
		 */
		if (root.left!=null) {
			root.leftMaxDistance=max(root.left.leftMaxDistance, root.left.rightMaxDistance)+1;
		}
		if (root.right!=null) {
			root.rightMaxDistance=max(root.right.leftMaxDistance, root.right.rightMaxDistance)+1;
		}
		/**
		 * 获取二叉树所有结点的最大距离
		 */
		if (root.leftMaxDistance+root.rightMaxDistance>maxLen) {
			maxLen=root.leftMaxDistance+root.rightMaxDistance;
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		BinaryTree tree=new BinaryTree();
		int[] data={2,8,7,4,9,3,1,6,7,5};
		tree.buildTree(data);//构建二叉树
		System.out.println("~~~~~~~~~~后序遍历~~~~~~~~~~");
		tree.postOrder();
		System.out.println();
		
		System.out.println("二叉树中结点的最大距离");
		tree.FindMaxDistance();
		System.out.println(tree.maxLen);
	}

}
package tt;
/** 
 * @author wyl
 * @time 2018年7月9日上午7:42:27
 */
public class Node {

	public int data;
	public Node left;
	public Node right;
	public int leftMaxDistance;
	public int rightMaxDistance;
	public Node() {
		// TODO Auto-generated constructor stub
	}
	public Node(int data){
		this.data=data;
		this.left=null;
		this.right=null;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Baymax_wyl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值