日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二叉树两节点距离java,求二叉树中两个节点的最远距离

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树两节点距离java,求二叉树中两个节点的最远距离 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題定義

如果我們把二叉樹看成一個圖,父子節點之間的連線看成是雙向的,我們姑且定義"距離"為兩節點之間邊的個數。寫一個程序求一棵二叉樹中相距最遠的兩個節點之間的距離。

計算一個二叉樹的最大距離有兩個情況:

情況A: 路徑經過左子樹的最深節點,通過根節點,再到右子樹的最深節點。

情況B: 路徑不穿過根節點,而是左子樹或右子樹的最大距離路徑,取其大者。

思路:

1,后序遍歷每一節點,找出該節點到最右邊的距離以及最左邊的距離;

2,找到之和最大的即可。

//需保存左子樹中最長距離、右子樹最長距離和當前樹的深度。

//以下提供兩種方法。

#include

#include

using namespace std;

int max(int l,int r)

{

return l>r?l:r;

}

struct BinaryTreeNode

{

int data;

BinaryTreeNode* left;

BinaryTreeNode* right;

BinaryTreeNode(int x)

:data(x)

, left(NULL)

, right(NULL)

{}

};

class BinaryTree

{

protected:

BinaryTreeNode* _root;

BinaryTreeNode* _CreateBinaryTree(int* arr, int& index, int size)

{

BinaryTreeNode* root = NULL;

if (index < size&&arr[index] != '#')

{

root = new BinaryTreeNode(arr[index]);

root->left = _CreateBinaryTree(arr, ++index, size);

root->right = _CreateBinaryTree(arr, ++index, size);

}

return root;

}

public:

BinaryTree()

:_root(NULL)

{}

BinaryTree(int *arr, int size)

{

int index = 0;

_root = _CreateBinaryTree(arr, index, size);

}

/*int MaxTwoNodeDistance()

{

if(_root==NULL)

{

return 0;

}

int maxDistance=0;

_Distance(_root,maxDistance);

return maxDistance;

}*/

int MaxTwoNodeDistance()

{

if(_root==NULL)

return 0;

int maxLeft=0;

int maxRight=0;

return _Distance(_root,maxLeft,maxRight);

}

int Height()

{

return _Height(_root);

}

void PreOrder_Non()

{

if (_root == NULL)

return;

BinaryTreeNode* cur = _root;

stack s;

s.push(_root);

while (!s.empty())

{

cur = s.top();

printf("%d ", cur->data);

s.pop();

if (cur->right)

s.push(cur->right);

if (cur->left)

s.push(cur->left);

}

cout << endl;

}

protected:

int _Distance(BinaryTreeNode* root,int& left,int &right)

{

if(root==NULL)

{

left=0;

right=0;

return 0;

}

int mll,mlr,mrl,mrr,dl,dr;

if(root->left==NULL)

{

left=0;

dl=0;

}

else

{

dl=_Distance(root->left,mll,mlr);

left=max(mll,mlr)+1;

}

if(root->right==NULL)

{

right=0;

dr=0;

}

else

{

dr=_Distance(root->right,mrl,mrr);

right=max(mrl,mrr)+1;

}

return max(max(dl,dr),left+right);

}

/*int _Distance(BinaryTreeNode* root,int& max)

{

if(root==NULL)

return 0;

int maxLeft=0;

int maxRight=0;

if(root->left)

{

maxLeft=_Distance(root->left,max);

if(maxLeft>max)

max=maxLeft;

}

if(root->right)

{

maxRight=_Distance(root->right,max);

if(maxRight>max)

max=maxRight;

}

if(maxLeft+maxRight>max)

max=maxLeft+maxRight;

return maxLeft>maxRight?maxLeft+1:maxRight+1;

}*/

int _Height(BinaryTreeNode* root)

{

if (root == NULL)

return 0;

int left = _Height(root->left);

int right = _Height(root->right);

return left > right ? left + 1 : right + 1;

}

};

int main()

{

int arr1[]={1,2,4,5,'#','#','#',7,'#','#',3,'#',6};

int arr2[]={1,2,3,4,'#','#','#',5,'#',6};

BinaryTree t1(arr1,sizeof(arr1)/sizeof(arr1[0]));

t1.PreOrder_Non();

cout<

BinaryTree t2(arr2,sizeof(arr2)/sizeof(arr2[0]));

t2.PreOrder_Non();

cout<

}

總結

以上是生活随笔為你收集整理的二叉树两节点距离java,求二叉树中两个节点的最远距离的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。