隨筆-126  評論-247  文章-5  trackbacks-0

              

          樹的特點:

          1. 每個結點有零個或多個子結點
           
          2. 每一個子結點只有一個父結點

          3. 沒有前驅的結點為根結點

          4. 除了根結點外,每個子結點可以分為m個不相交的子樹

           

          樹相關的術語:

          節點的度:一個節點含有的子樹的個數稱為該節點的度

          葉節點或終端節點:度為零的節點稱為葉節點


          非終端節點或分支節點
          :度不為零的節點


          雙親節點或父節點
          :若一個結點含有子節點,則這個節點稱為其子節點的父節點


          孩子節點或子節點
          :一個節點含有的子樹的根節點稱為該節點的子節點


          兄弟節點
          :具有相同父節點的節點互稱為兄弟節點


          樹的度
          :一棵樹中,最大的節點的度稱為樹的度


          節點的層次
          :從根開始定義起,根為第1層,根的子節點為第2層,以此類推

          樹的高度或深度:樹中節點的最大層次


          堂兄弟節點
          :雙親在同一層的節點互為堂兄弟


          節點的祖先
          :從根到該節點所經分支上的所有節點

          子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫

          森林:由mm>=0)棵互不相交的樹的集合稱為森林

           

          二叉樹 是每個節點最多有兩個子樹的樹結構,如上圖。

           


          /**
           * <!--
           * File   : binarytree.h
           * Author : fancy
           * Email  : fancydeepin@yeah.net
           * Date   : 2013-02-03
           * --!>
           
          */
          #include 
          <stdio.h>
          #include 
          <stdlib.h>
          #include 
          <malloc.h>
          #define Element char
          #define format "%c"

          typedef 
          struct Node {
              Element data;
              
          struct Node *lchild;
              
          struct Node *rchild;
          *Tree;

          int index = 0;  //全局索引變量

          //二叉樹構造器,按先序遍歷順序構造二叉樹
          //無左子樹或右子樹用'#'表示
          void treeNodeConstructor(Tree &root, Element data[]){
              Element e 
          = data[index++];
              
          if(e == '#'){
                  root 
          = NULL;
              }
          else{
                  root 
          = (Node *)malloc(sizeof(Node));
                  root
          ->data = e;
                  treeNodeConstructor(root
          ->lchild, data);  //遞歸構建左子樹
                  treeNodeConstructor(root->rchild, data);  //遞歸構建右子樹
              }
          }

          //先序遍歷二叉樹
          void preorderTraversal(Tree root){
              
          if(root){
                  printf(format, root
          ->data);
                  preorderTraversal(root
          ->lchild);
                  preorderTraversal(root
          ->rchild);
              }
          }

          //中序遍歷二叉樹
          void inorderTraversal(Tree root){
              
          if(root){
                  inorderTraversal(root
          ->lchild);
                  printf(format, root
          ->data);
                  inorderTraversal(root
          ->rchild);
              }
          }

          //后序遍歷二叉樹
          void postorderTraversal(Tree root){
              
          if(root){
                  postorderTraversal(root
          ->lchild);
                  postorderTraversal(root
          ->rchild);
                  printf(format, root
          ->data);
              }
          }
               

           


          /**
           * <!--
           * File   : BinaryTree.cpp
           * Author : fancy
           * Email  : fancydeepin@yeah.net
           * Date   : 2013-02-03
           * --!>
           
          */
          #include 
          "binarytree.h"

          int main() {

              
          //上圖所示的二叉樹先序遍歷序列,其中用'#'表示結點無左子樹或無右子樹
              Element data[23= {'-''+''a''#''#''*''b''#''#''-''c',
                                  
          '#''#''d''#''#''/''e''#''#''f''#''#'};
              Tree tree;
              treeNodeConstructor(tree, data);
              printf(
          "------------------------------------\n");
              printf(
          "\nCreate binary tree successfully!\n");
              printf(
          "\n------------------------------------");
              printf(
          "\n\n先序遍歷二叉樹結果: ");
              preorderTraversal(tree);
              printf(
          "\n\n中序遍歷二叉樹結果: ");
              inorderTraversal(tree);
              printf(
          "\n\n后序遍歷二叉樹結果: ");
              postorderTraversal(tree);
              system(
          "pause");
              
          return 0;

          }
              


           



            
          posted on 2013-02-03 11:11 fancydeepin 閱讀(1899) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 沧州市| 延寿县| 稻城县| 莱芜市| 宣武区| 广元市| 郎溪县| 喀喇| 惠安县| 延津县| 绿春县| 馆陶县| 丹阳市| 桐城市| 义乌市| 卢氏县| 资源县| 广丰县| 乌拉特中旗| 南康市| 盱眙县| 镇安县| 大悟县| 舞阳县| 额敏县| 陇川县| 法库县| 石渠县| 章丘市| 富源县| 富裕县| 乌恰县| 武城县| 定结县| 玛曲县| 霸州市| 伊春市| 扬中市| 浮梁县| 祁门县| 杨浦区|