【问题标题】:Print the path comprised by the nodes corresponding to the Diameter of a BST打印与 BST 的直径对应的节点所包含的路径
【发布时间】:2012-11-19 15:30:58
【问题描述】:

我知道如何求 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

【问题讨论】:

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


【解决方案1】:

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

  1. 让有一个名为max_height的变量。
  2. 初始化为零。
  3. 假设有一个名为depth的变量。
  4. depth 初始化为零。
  5. 遍历子树时,增加depth
  6. 如果depth 大于max_height,则将max_height 设置为 depth
  7. 从子树返回时,减少 depth

这假设读者知道如何遍历二叉树;这是另一个帖子的主题。

【讨论】:

  • 我知道如何找到二叉树的最大深度我需要做的是打印打印与 BST 直径相对应的节点所包含的路径
  • 我知道如何找到二叉树的 MaxDepth,我想打印由对应于 BST 直径的节点组成的路径。包含 MaxDepth 的路径,这个 Maxdepth Path 上的一些节点将是树的 Diamter 的一部分。从一棵树的直径,我可以找出直径的中心,它将在 maxDepth 路径上距根的 (D-floor(M/2)) 距离,其中 D- 没有。 MaxDepth 路径上的节点数,M- 树的直径。
  • 确定直径后能否打印节点:geeksforgeeks.org/archives/5687
【解决方案2】:
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;

}

}

【讨论】:

  • 最初调用函数时的“d”是什么?
  • d 是树的直径。这是找出叶节点的共同祖先的代码,BST的直径
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
相关资源
最近更新 更多