二叉树的基本操作小结

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  //后序遍历,非递归实现

  /*

  算法思想:利用栈来实现。从根结点开始,只要左子节点非空,则进栈,直到左子节点为空为止。取出栈顶元素(只是取,并去弹栈),判断

  1:取出的栈顶元素是否有右子节点,或者右子节点是否被访问过,若满足条件(无右子节点,或者右子节点被访问过),则输出该结点,同时弹栈,并且记录下该访问的节点。

  2:取出的栈顶元素,若有右子节点,且未被访问过,则指针继续移动到右子节点,重复一开始是否又左子节点的判断。

  */

  void Postorder2(BTree* bt)

  {

  Stack st;

  st.top=-1;

  BTree* t;

  int flag;

  do

  {

  while (bt!=NULL)

  {

  st.top++;

  st.a[st.top]=bt;

  bt=bt->left;

  }

  t=NULL;

  flag=1;

  while (st.top!=-1 && flag)

  {

  bt=st.a[st.top];

  if (bt->right==t)  //t:表示为null,或者右子节点被访问过了。

  {

  printf("%c ",bt->data);

  st.top--;

  t=bt;  //t记录下刚刚访问的节点

  }

  else

  {

  bt=bt->right;

  flag=0;

  }

  }

  } while (st.top!=-1);

  }

  //求二叉树的高度,递归实现

  int Height(BTree* bt)

  {

  int depth1,depth2;

  if (NULL==bt)

  {

  return 0;

  }

  else

  {

  depth1=Height(bt->left);

  depth2=Height(bt->right);

  if (depth1>depth2)

  {

  return (depth1+1);

  }

  else

  {

  return (depth2+1);

  }

  }

  }

  //层次遍历二叉树,用队列来实现

  void TraversalOfLevel(BTree* bt)

  {

  Queue q;

  q.front=q.rear=0;

  if (bt!=NULL)

  {

  printf("%c ",bt->data);

  }

  q.b[q.front]=bt;

  q.rear=q.rear+1;

  while (q.front<q.rear)

  {

  bt=q.b[q.front];

  q.front=q.front+1;

  if (bt->left!=NULL)

  {

  printf("%c ",bt->left->data);

  q.b[q.rear]=bt->left;

  q.rear=q.rear+1;

  }

  if (bt->right!=NULL)

  {

  printf("%c ",bt->right->data);

  q.b[q.rear]=bt->right;

  q.rear=q.rear+1;

  }

  }

  }

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答