E. DS二叉树—二叉树结点的最大距离

写一个函数,能找出该节点往下的层数最多是多少

然后遍历,对节点的左右节点往下的层数分别最多是多少,加起来

然后找出最多的那个

这里容易知道对应的俩个点都是子叶

不一定中间节点在头节点,比如样例的第三个,

 

这个用来记录层数和子叶的数据,找到子叶然后返回一个Date 类

到底了返回数值0 ,从子叶开始向上返回每次加一后的值,和子叶的数据

 遍历,每个节点都找左右然后加起来和longest比较,如果比他大,那需要

改longest,和最远距离对应的那对

 

#include <iostream>
using namespace std;
int longest=0;//记录最远距离
char leftchar;//记录最远距离的一对中的左
char rightchar;
class BiTreeNode;
class Date{
public:
    int t;
    char ch;
    Date(int t,char ch){
        this->t=t;
        this->ch=ch;
    }
};
class BiTreeNode{
public:
    char date;
    BiTreeNode *leftchild;
    BiTreeNode *rightchild;
};
class BiTree{
public:
    BiTreeNode *Root; //根节点指针
    int pos;
    string strTree;
    BiTreeNode *CreateBirtree();
    void PreOrder(BiTreeNode *t);
    void InOrder(BiTreeNode *t);
    void PostOrder(BiTreeNode *t);

public:
    BiTree(){}
    ~BiTree(){}
    void CreateTree(string TreeArray);//利用先序遍历结果创建二叉树
    void PreOrder()//前序遍历
    {
        PreOrder(Root);
    }
    Date findheight(BiTreeNode *t);
};
void BiTree::CreateTree(string TreeArray){
    pos=0;
    strTree.assign(TreeArray);
    Root=CreateBirtree();
}
//递归建树,私有函数,类内实现
BiTreeNode* BiTree::CreateBirtree(){
    BiTreeNode *T;
    char ch;
    ch=strTree[pos++];
    if(ch=='#') T=NULL;
    else{
        T=new BiTreeNode();
        T->date=ch;// 生成根节点
        T->leftchild=CreateBirtree();// 构造左子树
        T->rightchild=CreateBirtree();//构造右子树
    }
    return T;
}
// 定义先序遍历函数
void BiTree ::PreOrder(BiTreeNode *t) {
    if(t!=NULL){
        Date left=findheight(t->leftchild);
        if(left.t==0)
            left.ch=t->date;
        Date right= findheight(t->rightchild);
        if(right.t==0)
            right.ch=t->date;
        int sum=left.t+right.t;
        if(sum>longest){
            longest=sum;
            leftchar=left.ch;
            rightchar=right.ch;
        }
        PreOrder(t->leftchild);
        PreOrder(t->rightchild);
    }
}

Date BiTree ::findheight(BiTreeNode *t) {
    //若节点t不空,执行以下操作
    if(t!=NULL){
        Date left=findheight(t->leftchild);
        Date right=findheight(t->rightchild);
        if(left.t+right.t==0){//到底了,从这里是第一层
            return Date{1,t->date};
        }
        if(left.t>right.t){
            return Date{1+left.t,left.ch};
        }
        if(right.t>left.t){
            return Date{1+right.t,right.ch};//算上本身一层所以要加一
        }
    }
    return Date{0,'0'};//t=NULL 的情况
}

int main()
{
    int t;cin>>t;
    for (int i = 0; i < t; ++i) {
        longest=0;//每次都需要更新为0
        string str;cin >> str;
        BiTree *tree;
        tree = new BiTree();
        tree->CreateTree(str);
        tree->PreOrder();
        cout<<longest<<":";
        if(longest!=0)
            cout<<leftchar<<" "<<rightchar<<endl;
        else
            cout<<endl;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值