题解 | #删除链表中重复的结点#

按之字形顺序打印二叉树

http://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0


#define MaxSize 2000
int TreeDepth(struct TreeNode *p)
{
  int depth = 0;
  int LD, RD;
  if (p == NULL)
    return 0;
  else
  {
    LD = TreeDepth(p->left);
    RD = TreeDepth(p->right);
    return (LD >= RD ? LD : RD) + 1;
  }
}

int **Print(struct TreeNode *pRoot, int *returnSize, int **returnColumnSizes)
{
  struct TreeNode *que[MaxSize];
  struct TreeNode *temp;
  int depth = TreeDepth(pRoot);
  //计算深度
  int **arr;
  arr = (int **)malloc(sizeof(int *) * depth);
  for (int i = 0; i < depth; i++)
    arr[i] = (int *)malloc(sizeof(int) * MaxSize);
//层序遍历
//用队列来记录节点,二叉树从左向右进入队列,先进先出
//用col来记录每一层需要输出的列数
  int front = 0, rear = 0;
  int row = 0, col[depth];
  memset(col, 0, sizeof(col));

  if (pRoot)
  {
    que[++rear] = pRoot;
    col[row] = 1;
    while (rear != front)
    {
      //输出是下标为偶数行顺序进入数组,奇数行逆序进入数组
      if (row % 2 == 0)
      {
        for (int i = 0; i < col[row]; i++)
        {
          temp = que[++front];
          arr[row][i] = temp->val;
          if (temp->left)
          {
            que[++rear] = temp->left;
            col[row + 1]++;
          }
          if (temp->right)
          {
            que[++rear] = temp->right;
            col[row + 1]++;
          }
        }
        row++;
      }

      if (row % 2 == 1 && rear!=front)
      {
        for (int i = col[row] - 1; i >= 0; i--)
        {
          temp = que[++front];
          arr[row][i] = temp->val;
          if (temp->left)
          {
            que[++rear] = temp->left;
            col[row + 1]++;
          }
          if (temp->right)
          {
            que[++rear] = temp->right;
            col[row + 1]++;
          }
        }
        row++;
      }
    }
  }


*returnSize = depth;
*returnColumnSizes =col;
return arr;
}

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务