我想找到二叉树中最长的路径。我计划将它们添加到列表中,这样我就可以告诉我的敌人角色在简易模式上走很长的路。
private static <T> ArrayList<T> depthFirstSearch(BinaryNode<T> node)
{
if(node != null)
{
Stack<BinaryNode<T>> stack = new Stack<BinaryNode<T>>();
stack.push(node);
while(!stack.isEmpty())
{
BinaryNode<T> currentNode = stack.pop();
if(currentNode.right != null)
stack.push(currentNode.right);
// We want to visit left child first, so push left node last.
if(currentNode.left != null)
stack.push(currentNode.left);
}
}
}
我已经编写了这段代码,但这是一团糟。我正在尝试使用DFS找到最长的路径。有什么建议吗?
编辑:我确实拥有树的高度,我可以使用它。
public static <T> int height(BinaryNode<T> t)
{
if (t == null)
return -1;
else
return 1 + Math.max(height(t.left), height(t.right));
}
我的问题是:我什么时候才知道我找到了使用DFS的最长路径,以便我可以将节点添加到我的列表中?
答案 0 :(得分:8)
树中最长的路径称为“直径”。您可以在此处查看算法的实现:http://www.geeksforgeeks.org/diameter-of-a-binary-tree/
答案 1 :(得分:2)
在以下链接中检查Niki给出的答案。那就是O(n)解决方案
答案 2 :(得分:0)
如果有人需要,我会留下这个答案。这是我在c ++中的解决方案。
函数Get_Max_Path()
返回一个向量,该向量本身具有最长的路径,因此可以得到路径,它是长度,并且在需要时可以求和:
vector<int> Max_Path(vector<int>rightpath, vector<int>leftpath)
{
return (rightpath.size() > leftpath.size()) ? rightpath : leftpath;
}
vector<int> GetPath(node* N, vector<int> v)
{
v.push_back(N->Data);
return v;
}
vector<int> Get_Max_Path(node* root)
{
if (!root) return
vector<int>(0);
return Max_Path(GetPath( root, Get_Max_Path(root->Right)),
GetPath( root, Get_Max_Path(root->Left)) );
}
这是树结构
class node
{
public:
node* Right = NULL;
node* Left = NULL;
int Data;
};
class Tree
{
private:
node* Root = NULL;
public:
void Insert_Node(int Data)
{
node* DataNode = (node*)malloc(sizeof(node));
DataNode->Data = Data;
DataNode->Left = DataNode->Right = NULL;
if (Root == NULL) {
Root = DataNode;
return;
}
node* tmp_root = Root, * prev = NULL;
while (tmp_root != NULL)
{
prev = tmp_root;
tmp_root = (tmp_root->Data < Data) ?
tmp_root->Right :
tmp_root->Left;
}
(prev->Data < Data) ? (prev->Right = DataNode) : (prev->Left = DataNode);
}
vector<int> Max_Path(vector<int>rightpath, vector<int>leftpath)
{
return (rightpath.size() > leftpath.size()) ? rightpath : leftpath;
}
vector<int> Update_Path(node* N, vector<int> v)
{
v.push_back(N->Data);
return v;
}
vector<int> Get_Max_length_Path(node* root)
{
if (!root) return
vector<int>(0);
return Max_Path(
Update_Path(root, Get_Max_length_Path(root->Right)),
Update_Path(root, Get_Max_length_Path(root->Left)));
}
vector<int> Get_Max_length_Path()
{
return Get_Max_length_Path(Root);
}
};
这是驱动程序代码
int main()
{
Tree T;
int nodes[] = { 11, 6, 8, 19, 4, 13, 5, 17, 43, 49, 16, 31, 32};
int length = sizeof(nodes) / sizeof(nodes[0]);
for (size_t i = 0; i < length; i++)
T.Insert_Node(nodes[i]);
int sum = 0;
vector<int> path = T.Get_Max_length_Path();
cout << "The path length is : " << path.size() <<endl;
cout << "The path from the leaf to the root is : ";
for (int i = 0; i < path.size(); i++)
{
cout << path[i] << " ";
sum += path[i] ;
}
cout << endl;
cout << "the path sum is :" << sum << endl;
return 0;
}
测试用例
输出
The path length is : 5 The path from the leaf to the root is : 16 17
13 19 11 the path sum is :76