打印与BST的Diameter对应的节点所包含的路径

时间:2012-11-19 15:30:59

标签: c++ c binary-search-tree

我知道如何找到BST的直径。

int diameter(struct node * tree)
{

if (tree == 0)
 return 0;


int lheight = height(tree->left);
int rheight = height(tree->right);

int ldiameter = diameter(tree->left);
int rdiameter = diameter(tree->right);

return max(lheight + rheight + 1, max(ldiameter, rdiameter));
}




int height(struct node* node)
{

if(node == NULL)
   return 0;


return 1 + max(height(node->left), height(node->right));
}

我应该在代码中进行哪些更改以打印路径,即从一个叶节点到另一个直径叶节点的序列中对应于树直径的节点。

例如: -

                     8
                   /  \
                  1    12
                  \     /
                   5   9
                 /   \
                4     7
                     /
                    6

输出应为6 7 5 1 8 12 9

2 个答案:

答案 0 :(得分:3)

这是一种用于查找二叉树的最大深度的算法:

  1. 让我们有一个名为max_height的变种。
  2. 初始化为零。
  3. 让我们有一个名为depth的变量。
  4. depth初始化为零。
  5. 遍历子树时,请增加depth
  6. 如果depth大于max_height,请将max_height设置为 depth
  7. 从子树返回时,递减depth
  8. 这假设读者知道如何遍历二叉树;这是另一篇文章的主题。

答案 1 :(得分:0)

struct node
{    
node* left,right;
int data;
};
struct path
{
node *nodepointer;
int length;
};
int flag=0;

node *x,*y,*lca;

path *printpath(node *leaf,int d)
{
if(flag==0)
{
    path *dia= new path;
    dia->length=0;
    dia->nodepointer=NULL;

    if(leaf==NULL)
    return dia;

    path *a=new path;
    path *b=new path;
    a=printpath(leaf->left,d);
    b=printpath(leaf->right,d);


    if(a->length + b->length + 1 == d )
    {
        lca=leaf;
        x=a->nodepointer;
        y=b->nodepointer;
        flag=1;
    }

    dia->length=max(a->length,b->length)+1;

    if(a->length > b->length && a->nodepointer!=NULL)
    {
        dia->nodepointer=a->nodepointer;
    }
    if(b->length >= a->length && b->nodepointer!=NULL)
    {
        dia->nodepointer=b->nodepointer;
    }
    if(a->nodepointer==NULL && b->nodepointer==NULL)
    {
            dia->nodepointer=leaf;
    }

    return dia;

}

}