首先,我认为您可能将树的深度与树的高度混淆了。说明请参考What is the difference between tree depth and height?。
例如,以下是此(二叉)树中节点的深度和高度('0' 为根):
0 -- depth 0, height 2
/ \
1 2 -- depth 1, height 1 and 2, respectively, for nodes 1 and 2
/ \
3 4 -- depth 2, height 0
如您所见,树根的深度为“0”,即 O(1) 计算。然而,就递归而言,树的高度更有趣,可以使用以下公式计算:
struct TreeNode {
T _value;
typedef TreeNode* node_ptr;
node_ptr _left, _right;
};
...
int treeHeight(Node* node)
{
return std::max(node->_left? 1 + height(node->_left) : 0,
node->_right? 1 + height(node->_right) : 0);
}
...
std::cout << treeHeight(root);
...
基本思想是这样的:
在递归(深度优先)遍历期间,如果到达叶节点,则返回值“0”(即每个叶节点的高度)。否则,计算以非叶节点为根的树的高度(即该节点的左子树和右子树的高度的最大值 + 节点本身的 1)。从树的根开始。
我想在您的问题中解决的第二个方面是关于我从您的函数签名中收集到的内容:
int treeDepth(int depth) const
以及你的称呼方式:
root->treeDepth(1);
树的深度不有助于成为根的属性。相反,它是树的一个属性,它由树节点组成,其中一个是 root 节点。因此,我将定义类(此处显示的 C++ 结构)如下:
template<class T>
struct BinaryTree {
struct TreeNode {
T _value;
typedef TreeNode* node_ptr;
node_ptr _left, _right;
};
TreeNode _root_node;
typedef typename TreeNode::node_ptr node_ptr;
node_ptr _root;
...
int height(node_ptr node) const;
...
};
最后,在树中找到给定节点的深度:
int depth(node_ptr node) const;
// returns depth of node if it is in the tree, else -1
是一个可以应用递归的问题。但是,递归方法并不自然,广度优先(或级别顺序)遍历将更适合于此。