[数据结构]二叉树

(1)二叉树的概念 

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

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

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

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. typedef struct BiTNode{  
  2. elemtype data;  
  3. struct BiTNode *lchild,rchild;  
  4. }BiTNode,*BiTree;  


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

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. int Initiate(BiTree *bt)  
  2. {  
  3.     if((bt=(BiTNode *)malloc(sizeof(BiTNode))==NULL)  
  4.         return 0;  
  5.     bt->lchild=NULL;  
  6.     bt->rchild=NULL;  
  7.     return 1;  
  8. }  


(3)二叉树的遍历

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

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. void PreOrder(BiTree bt)  
  2. {/*先序遍历二叉树bt*/  
  3.   if (bt==NULL) return;     /*递归调用的结束条件*/  
  4.   Visite(bt->data);       /*访问结点的数据域*/  
  5.   PreOrder(bt->lchild);   /*先序递归遍历bt的左子树*/  
  6.   PreOrder(bt->rchild);   /*先序递归遍历bt的右子树*/    
  7. }  

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

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

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. void NRPreOrder(BiTree bt)  
  2.   
  3. {/*非递归先序遍历二叉树*/  
  4.   BiTree stack[MAXNODE],p;  
  5.   int top;  
  6.   if (bt==NULL) return;  
  7.   top=0;  
  8.   p=bt;  
  9.   while(!(p==NULL&&top==0))  
  10.      { while(p!=NULL)  
  11.           { Visite(p->data);    /*访问结点的数据域*/  
  12.             if (top<MAXNODE-1)  /*将当前指针p压栈*/  
  13.              { stack[top]=p;  
  14.                top++;  
  15.               }  
  16.             else { printf(“栈溢出”);  
  17.                    return;  
  18.                   }  
  19.             p=p->lchild;         /*指针指向p的左孩子*/  
  20.            }  
  21.           if (top<=0) return;     /*栈空时结束*/  
  22.           else{ top--;  
  23.                 p=stack[top];            /*从栈中弹出栈顶元素*/  
  24.                 p=p->rchild;             /*指针指向p的右孩子结点*/  
  25.                }  
  26.       }  
  27. }  


数据结构—二叉树

原文地址:https://www.cnblogs.com/zhiliao112/p/4232215.html