算法2013110901

来源:互联网 发布:linux下svn测试 编辑:程序博客网 时间:2024/05/22 09:49

题设:在二叉树的根节点到各叶子节点的所有路径中,某些路径更长(即所包含节点数目与树的高度相同),求这样的路径(任意一条即可)。

解法:先求出二叉树的高度,找到某个叶子节点所在层数为最大值即可。

#include <vector>  #include <cassert>      struct Node {        Node    *m_left;        Node    *m_right;        int     m_data;    };      int getHeight(const Node *root) {      if (!root) {          return 0;      }  const int leftHeight = getHeight(root);    const int rightHeight = getHeight(root);const int higher = leftHeight >= rightHeight ? leftHeight : rightHeight;    return higher+1;  } bool isLongestPath(const Node *node, std::vector<const Node*> *routine, int depth, int maxHeight) {assert(routine);if (!node) {return depth == maxHeight;}++depth;if (isLongestPath(node->m_left, routine, depth, maxHeight)|| isLongestPath(node->m_right, routine, depth, maxHeight)) {routine->push_back(node);return true;}return false;}     void findLongestPath(const Node *root, std::vector<const Node*> *routine) {      assert(root);    assert(routine->empty());       const int maxHeight = getHeight(root);    std::vector<const Node*> reversed;  const bool longest = isLongestPath(root, &reversed, 0, maxHeight);    assert(longest);    assert(!reversed.empty());      for (std::vector<const Node*>::const_reverse_iterator it = reversed.rbegin(); it != reversed.rend(); ++it) {          routine->push_back(*it);      }   }

原创粉丝点击