zoukankan      html  css  js  c++  java
  • 二叉树结点间最大距离

    如果把二叉树看成一个图,父子节点之间的连线看成是双向的,则定义距离为:两个节点之间边的个数

    求一棵二叉树中相距最远的两个节点之间的距离

    相距最远的两个节点一定是叶子节点,可以分为两种情况:

    1.若最远距离的路径经过根ROOT,则两个最远的节点分别为两个不同子树的叶子结点,如图1

    二叉树结点中的最大距离 - 枫叶 - 枫叶

    图1

    2.若路径不经过ROOT,那么这两个节点一定属于根的K个子树之一,并且它们也是该子树中相距最远的两个顶点,如图2

    二叉树结点中的最大距离 - 枫叶 - 枫叶

    图2 

    总结:最大距离为某个结点左子树的高度加上右子树高度


    /********************************************************************************/
    /* 计算二叉树中节点的最大距离,即求一棵二叉树中相距最远的两个节点之间的距离     */
    /********************************************************************************/
    
    #include<iostream>
    #include<malloc.h>
    #include<stdlib.h>
    #define ERROR 0
    using namespace std;
    struct BiTree//标识一棵树
    {
    	BiTree *lchild;
    	BiTree *rchild;
    	int m_nValue;
    };
    void InitTree(BiTree *&root)//初始化一棵二叉树(默认为满二叉树)
    {
    	int data;
    	cin>>data;
    	root=(BiTree*)malloc(sizeof(BiTree));//生成根结点
    	if(!root)exit(ERROR);
    	root->m_nValue=data;
    	if(root->m_nValue==0)//如果根结点值为0,则释放掉
    	{
    		root=NULL;
    		free(root);
    	}
    	else if(root!=NULL)
    	{
    		InitTree(root->lchild);
    		InitTree(root->rchild);
    	}
    }
    //通过先序遍历和中序列遍历确定树的形状
    void PreTraverse(BiTree *root)//先序
    {
    	if(root)
    		cout<<root->m_nValue<<" ";
    	if(root->lchild)
    		PreTraverse(root->lchild);
    	if(root->rchild)
    		PreTraverse(root->rchild);
    }
    void MidTraverse(BiTree *root)//中序
    {
    	if(root->lchild)
    		MidTraverse(root->lchild);
    	if(root)
    		cout<<root->m_nValue<<" ";
    	if(root->rchild)
    		MidTraverse(root->rchild);
    }
    int Max(int a,int b)
    {
    	if(a>b)
    		return a;
    	else
    		return b;
    }
    int GetHeight(BiTree *root)//获得树的高度
    {
    	int len;
    	if(root==NULL)
    		return 0;
    	else
    		return Max(GetHeight(root->lchild),GetHeight(root->rchild))+1;
    }
    int SearchMaxLen(BiTree *root)//获得结点距离最大的结点,最大距离为某个结点左子树的高度加上右子树高度
    {
    	static int MaxLen=0;
    	int temp;
    	if(root)
    	{
    		temp=GetHeight(root->lchild)+GetHeight(root->rchild);//左子树的高度加右子树的高度
    		if(temp>MaxLen)
    			MaxLen=temp;
    	}
    	if(root->lchild)
    		SearchMaxLen(root->lchild);//递归查找左子树
    	if(root->rchild)
    		SearchMaxLen(root->rchild);//递归查找右子树
    	return MaxLen;
    }
    
    int main()
    {
    	int data;
    	int MaxDistance;
    	BiTree *root=NULL;
    
    	InitTree(root);
    
    	cout<<"先序遍历:";
    	PreTraverse(root);
    	cout<<endl;
    	cout<<"中序遍历:";
    	MidTraverse(root);
    	cout<<endl;
    	cout<<"最大距离:"
    	    MaxDistance=SearchMaxLen(root);
    	cout<<MaxDistance;
    	return 1;
    
    }
    

      


  • 相关阅读:
    【转】【MFC】 StretchBlt绘图图像失真
    【转】MFC 各类型相互转换
    【转】MFC CListCtrl 使用技巧
    【数学】关于已知线段长度获取某一点对应线段的百分比
    【MySQL】MySQL 常用语法之锁表与解锁表
    C#通用类库
    WPF Knowledge Points
    WPF中的WndProc
    C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值
    c#正则获取html里面a标签href的值
  • 原文地址:https://www.cnblogs.com/dartagnan/p/2191172.html
Copyright © 2011-2022 走看看