[数据结构]二叉树

(1)二叉树的概念 

二叉树(Binary Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。
满二叉树: 在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的一棵二叉树称作满二叉树。
完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树

(2)二叉树的基本操作与存储

 二叉树的二叉链表存储表示可描述为

 typedef struct BiTNode{
	elemtype data;
	struct BiTNode *lchild,rchild;
	}BiTNode,*BiTree;


建立一个二叉树,使其只有头结点

int Initiate(BiTree *bt)
{
	if((bt=(BiTNode *)malloc(sizeof(BiTNode))==NULL)
		return 0;
	bt->lchild=NULL;
	bt->rchild=NULL;
	return 1;
}


(3)二叉树的遍历

二叉树的遍历是指按照某种顺序访问二叉树中的每个结点,使每个结点被访问一次且仅被访问一次。
先序遍历:
(1)访问根结点;
(2)先序遍历根结点的左子树;
(3)先序遍历根结点的右子树。
    先序遍历二叉树的递归算法如下:

void PreOrder(BiTree bt)
{/*先序遍历二叉树bt*/
  if (bt==NULL) return;     /*递归调用的结束条件*/
  Visite(bt->data);       /*访问结点的数据域*/
  PreOrder(bt->lchild);   /*先序递归遍历bt的左子树*/
  PreOrder(bt->rchild);   /*先序递归遍历bt的右子树*/  
}


中序遍历:先左子树,再根,再右子树
后序遍历:先遍历树左子树,再右子树,最后根

先序遍历的非递归实现
可以利用栈的后进先出的特点实现:

void NRPreOrder(BiTree bt)

{/*非递归先序遍历二叉树*/
  BiTree stack[MAXNODE],p;
  int top;
  if (bt==NULL) return;
  top=0;
  p=bt;
  while(!(p==NULL&&top==0))
     { while(p!=NULL)
          { Visite(p->data);    /*访问结点的数据域*/
            if (top<MAXNODE-1)  /*将当前指针p压栈*/
             { stack[top]=p;
               top++;
              }
            else { printf(“栈溢出”);
                   return;
                  }
            p=p->lchild;         /*指针指向p的左孩子*/
           }
          if (top<=0) return;     /*栈空时结束*/
          else{ top--;
                p=stack[top];            /*从栈中弹出栈顶元素*/
                p=p->rchild;             /*指针指向p的右孩子结点*/
               }
      }
}


数据结构—二叉树

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值