求一个二叉树中两个结点的最大距离

 

求一个二叉树中两个结点的最大距离分为两个情况:
1: 最大距离为从左子树的最深节点,通过根节点,再到右子树的最深节点
2: 或路径不穿过根节点,而是左子树或右子树的最大距离路径

template<class T>
struct BinaryTreeNode
{
    BinaryTreeNode(const T& value): data(value), leftchild(NULL), rightchild(NULL){}
    T data;
    BinaryTreeNode<T>* leftchild;   
    BinaryTreeNode<T>* rightchild;  
};

template<class T>
class BinaryTree
{

public:
    BinaryTree():parent(NULL){}
    BinaryTree(const T array[], int size, const T& invalid)
    {
        int index = 0;
        CreateBinaryTree(parent, array, size, index, invalid);
    }

    //求最大距离
    void MaxDistance()
    {
        int maxlen = 0;
        cout << MaxDistance(parent, maxlen ) << endl;
        cout << maxlen<< endl;
    }
private:
    void CreateBinaryTree(Node* &parent, const T array[], int size, int & index, const T& invalid)
    {
        if (index < size&&array[index] != invalid)
        {
            parent= new BinaryTreeNode(invalid);
            parent->data= array[index];

            CreateBinaryTree(parent->leftchild, array, size, ++index, invalid);
            CreateBinaryTree(parent->rightchild, array, size, ++index, invalid);
        }
    }

    int  MaxDistance(BinaryTreeNode* parent, int &maxlen)
    {
        if (parent== NULL)
            return 0;

        int leftchildlen = MaxDistance(parent->leftchild, maxlen);
        int rightchildlen = MaxDistance(parent->rightchild, maxlen);

        int temp = leftchildlen + rightchildlen ;
        if (temp > maxlen)
            maxlen = temp;

        return leftchildlen > rightchildlen ? leftchildlen + 1 : rightchildlen + 1;
    }

    BinaryTreeNode* parent;
};

void Test()
{
    char array[] = "12##3468####5#7#9";
    BinaryTree<char> root(array, strlen(array), '#');
    root.MaxDistance();
}

int main()
{
    Test();
    return 0;
}

求一个二叉树的任意两个节点的距离:https://blog.csdn.net/qq_38251888/article/details/88831919

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值