【问题标题】:Generating a balanced binary tree生成平衡二叉树
【发布时间】:2016-05-22 00:19:24
【问题描述】:

我不确定这是否正在做它应该做的事情。 我的目标是从一组值生成平衡的二叉树。 请让我知道这是否正确。

注意:不是平衡二叉搜索树,只是平衡二叉树。

int heightPrivate(nodePtr node)
{
if (node == NULL)
  return -1;

return 1 + std::max(heightPrivate(node->left), heightPrivate(node->right));
} 

void addNodePrivate(nodePtr node, int val)
{
  if (root == NULL)
  {
    root = new BTNode;
    root->data = val;
    root->left = root->right = NULL;
  }
  else
  {
    if (node->left == NULL)
    {
      node->left = new BTNode;
      node->left->data = val;
      node->left->left = node->left->right = NULL;
    }
    else if (node->right == NULL)
    {
      node->right = new BTNode;
      node->right->data = val;
      node->right->left = node->right->right = NULL;
    }
    else
    {
      int lheight = heightPrivate(node->left);
      int rheight = heightPrivate(node->right);

      if (lheight < rheight)
        addNodePrivate(node->left, val);
      else if (rheight < lheight)
        addNodePrivate(node->right, val);
      else
        addNodePrivate(node->left, val);
    }
  }
}

void printPostorderPrivate(nodePtr p, int indent=0)
{
  if(p != NULL) {
    if(p->left) printPostorderPrivate(p->left, indent+4);
    if(p->right) printPostorderPrivate(p->right, indent+4);
    if (indent) {
        std::cout << std::setw(indent) << ' ';
    }
    std::cout<< p->data << " \n ";
  }
}

主要...

int main()
{
  BTree tree;

  tree.addNode(1);
  tree.addNode(2);
  tree.addNode(3);
  tree.addNode(4);
  tree.addNode(5);
  tree.addNode(6);
  tree.addNode(7);

  tree.printPostorder();

我得到的结果是这样的:

            7
         4 
         6
     2
         5
     3
 1

2 的孩子是 4 和 5。问题是为什么 7 会更上一层楼。

【问题讨论】:

    标签: c++ binary-tree


    【解决方案1】:

    出现 7 的原因是因为在 addNodePrivate 方法中检查了两个子分支的高度,如果它们相等则向左。

    所以当您插入 7 时,当程序位于根(节点 1)时,它会看到左分支的高度和右分支的高度都等于 1(节点 2 有孩子 5 和 4,但没有孙子,节点 3 有子 6,也没有孙子),所以它向左移动 - 沿着节点 2 的分支向下。

    要达到你想要的,你需要选择具有最短路径的分支,所以比较两个分支的高度是不够的。

    希望对您有所帮助,祝您好运。

    【讨论】:

    • 没错,我通过实现一个计算节点数的方法实现了我想要的,并以此为基础进行选择。但无论如何,很好的解释,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2013-12-18
    相关资源
    最近更新 更多