亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? btreebalance.cpp

?? 隨機生成用戶要求個數的整數
?? CPP
字號:
/*
程序作者: monkeylee
程序名稱: 二叉樹平衡因子
程序功能: 隨機生成用戶要求個數的整數,生成二叉樹(無重復),
   可以進行生成、遍歷、查找二叉樹,而且進行動態的查找,
   如果沒有找到節點就把這個值接到樹上
   能夠顯示節點的產生順序、平衡因子(失敗),節點值
創建時間: 2007.12.01
最后更新: 2007.12.03
*/

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//自引用結構
struct treeNode
{
 int data;     //節點值
 int balance;    //平衡因子
 int order;     //生成順序
 struct treeNode *left;  //指向左子樹的指針
 struct treeNode *right;  //指向右子樹的指針
 struct treeNode *father;
}; /*結構定義END */

typedef struct treeNode TreeNode;
typedef TreeNode * TreeNodePtr;

/*函數原型*/
void insertNode(TreeNodePtr &rootPtr,int value,int order); //插入節點
void inOrder(TreeNodePtr rootPtr);   //中序遍歷
int instructions();     //菜單
void search(TreeNodePtr &rootPtr,int value,int n);  //查找

//----------------------------------------------------------------------------------
/*主函數*/
void main()
{
 int item;     //要操作的數據
 int choices;     //存儲隨機制的變量
 int i;      //循環計數器
 int n;      //節點個數
 TreeNodePtr rootPtr=NULL;   //樹在開始的時候為空

 while(choices=instructions())
 {
  switch(choices)
  {
  case 1:
   rootPtr=NULL;
   printf("輸入要生成二叉樹的節點數>>");
   scanf("%d",&n);
   if(n<=0)
   {
    printf("輸入節點數必須大于等于1\n");
    break;
   }
   srand(time(NULL));
   for(i=1;i<=n;i++)
   {
    item=rand()%(10*n);
    insertNode(rootPtr,item,i);
   }/*END for*/
   break;


  case 2:
   printf("中序遍歷:\n");
   if(rootPtr==NULL)
    break;
   inOrder(rootPtr);
   printf("\n");
   break;
  case 3:
   printf("輸入要找的數>>");
   scanf("%d",&item);
   search(rootPtr,item,i);
   i++;
   break;

  default:
   printf("請輸入正確的選項!\n");
  }/*END switch*/
 }

 printf("\n");

}/*END main函數*/
//----------------------------------------------------------------------------------
int instructions()
{
 int choice;
 printf("\n菜單: 1.生成  2.遍歷  3.查找  0.退出\n>>");
 scanf("%d",&choice);
  return(choice);
}/*END instructions*/
//----------------------------------------------------------------------------------
/*將節點插入到樹中*/
void insertNode(TreeNodePtr &rootPtr,int value,int order)
{

 //生成新節點,找到一個要連的地方
 TreeNodePtr currentPtr=rootPtr;
 TreeNodePtr newPtr;
 TreeNodePtr prePtr=rootPtr;
 if(newPtr=(TreeNodePtr)malloc(sizeof(TreeNode)))
 {
  newPtr->data=value;
  newPtr->balance=0;
  newPtr->order=order;
  newPtr->left=NULL;
  newPtr->right=NULL;
  newPtr->father=NULL;
 }/*END if*/

 else
 {
  printf("沒有分配空間成功!\n");
  exit(0);
 }/*END else*/
 

 /*如果樹為空*/
 if(rootPtr==NULL)
 {
  rootPtr=newPtr;
 }/*END if*/

 /*如果樹不為空*/
 else
 {
  //找到了要插入的位置由currentPtr來指向
  while(currentPtr!=NULL && prePtr->data!=value)
  {
   prePtr=currentPtr;
   if(value<currentPtr->data)
   {
    currentPtr=currentPtr->left;
   }
   else 
   {
    currentPtr=currentPtr->right;
   }
  }
  //-----------------------------------------------------------------左節點
  //如果最后插入到前一個節點的左節點
  if(value<prePtr->data)
  {
   //把新節點連上
   prePtr->left=newPtr;
   newPtr->father=prePtr;

   //如果插入節點有個兄弟節點,則只需改變新節點的父節點的平衡因子,其它不用管
   if(prePtr->right!=NULL)
   {
     prePtr->balance++;
   }

   /*如果插入節點沒有兄弟節點,修改新節點父節點的平衡因子,再往上面追溯
   這里分兩種情況,所追溯的節點沒有兄弟節點則肯定修改平衡因子,但是如果
   所追溯的節點有個兄弟節點,又要分兩種情況討論,如果所追溯的是它父節點的
   左孩子,那么如果它的父節點的平衡因子改變之后仍然小于等于0,則追溯停止
   如果大于0則還要繼續往上追溯,直到找到一個節點又兩個孩子,如果從左節點上去的
   則如果平衡因子大于0繼續否則停止,如果是從右節點上去的,如果其父節點平衡因子大于等于
   0則停止否則繼續追溯*/

   //插入節點沒有兄弟節點
   else
   {
    currentPtr=newPtr->father; //初始化currentPtr指向新插入節點的父節點
    prePtr=newPtr;    //初始化prePtr指向新節點

    //一直向上追溯,一直到父節點才停
    while(currentPtr->father!=NULL)
    {

     //如果currentPtr所指向的節點有兩個孩子,則有可能停了下來
     if(currentPtr->left!=NULL && currentPtr->right !=NULL)
     {
      //如果從左路上去
      if(currentPtr->left==prePtr)
      {
       currentPtr->balance++;
       if(currentPtr->balance<=0)
        break;
      }

      //如果從右路上去
      else
      {
       currentPtr->balance--;
       if(currentPtr->balance>=0)
        break;
       
      }
      currentPtr=currentPtr->father; //向上移動
      prePtr=prePtr->father;   //向上移動
     }
     //如果所指向的節點currentPtr所指向的節點只有一個孩子則改變了平衡因子繼續
     else
     {
      if(currentPtr->left==prePtr)
       currentPtr->balance++;
      else
       currentPtr->balance--;
      
      currentPtr=currentPtr->father; //向上移動
      prePtr=prePtr->father;   //向上移動
     }

    }/*END  while*/


    //處理currentPtr指到了根節點的情況
    if(currentPtr->father==NULL)
    {
     if(currentPtr->left==prePtr)
      currentPtr->balance++;
     else 
      currentPtr->balance--;
    }

   }/*END  else*/

  }/*END  else*/

 //-----------------------------------------------------------------右節點
  //如果插入的節點在前一個節點的右節點上
  else if(value>prePtr->data)
  {
   //連接新節點
   prePtr->right=newPtr;
   newPtr->father=prePtr;

   //如果在一個非葉子節點上插入,則只改變父節點的平衡因子
   if(prePtr->left!=NULL )
   {
     prePtr->balance--;
   }

   //如果在一個葉子節點上插入,
   else
   {
    currentPtr=newPtr->father; //初始化currentPtr
    prePtr=newPtr;    //初始化prePtr

    while(currentPtr->father!=NULL)
    {
     //如果currentPtr有兩個節點
     if(currentPtr->left!=NULL && currentPtr->right !=NULL)
     {
      if(currentPtr->left==prePtr)
      {
       currentPtr->balance++;
       if(currentPtr->balance<=0)
        break;
      }
      else
      {
       currentPtr->balance--;
       if(currentPtr->balance>=0)
        break;
       
      }
      prePtr=currentPtr;
      currentPtr=currentPtr->father;
     }
     //currentPtr節點只有一個節點
     else
     {
      if(currentPtr->left==prePtr)
       currentPtr->balance++;
      else
       currentPtr->balance--;
      prePtr=currentPtr;
      currentPtr=currentPtr->father;
     }

    }/*END  while*/
    if(currentPtr->father==NULL)
    {
     if(currentPtr->left==prePtr)
      currentPtr->balance++;
     else 
      currentPtr->balance--;
    }

   }/*END else*/

  }/*END else if*/

 }/*END else*/
}/*END insertNode()函數*/


//----------------------------------------------------------------------------------

/*對樹進行中序遍歷*/
void inOrder(TreeNodePtr rootPtr){
 /*如果樹不為空*/
 if(rootPtr!=NULL){
  inOrder(rootPtr->left);
  printf("[生成順序=%-3d] [節點值=%-5d] [平衡因子=%-3d]\n",rootPtr->order,rootPtr->data,rootPtr->balance);
  inOrder(rootPtr->right);
 }/*END if*/

}/*END inOrder()函數*/

//----------------------------------------------------------------------------------
/*查找從頭節點一直到查找值過程*/
void search(TreeNodePtr &rootPtr,int value,int i){
 TreeNodePtr prePtr=rootPtr;
 TreeNodePtr currentPtr=rootPtr;
 TreeNodePtr newPtr;
 int n=1;
 while(currentPtr!=NULL && currentPtr->data!=value){
  printf("%d > ",currentPtr->data);
  prePtr=currentPtr;
  if(value<currentPtr->data)
   currentPtr=currentPtr->left;
  else
   currentPtr=currentPtr->right;
  n++;
 }/*尋找*/

 //如果沒有找到節點
 if(currentPtr==NULL){
  printf("沒有找到,將這個值插入...\n");
  insertNode(rootPtr,value,i);
 }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人在线免费| 国产精品久久福利| 精品99一区二区| 久久综合九色综合97婷婷女人| 欧美日韩精品综合在线| 欧美人与禽zozo性伦| 日韩欧美区一区二| 国产情人综合久久777777| 国产精品区一区二区三区| 亚洲精品一卡二卡| 五月婷婷欧美视频| 国产成人免费在线观看| 成人激情视频网站| 91精品国产免费久久综合| 精品福利一区二区三区| 中文字幕一区在线观看视频| 亚洲欧美另类小说| 国产一区二区三区免费观看| 成人黄色777网| 欧美日韩精品免费| 日韩欧美亚洲另类制服综合在线| 国产精品美女一区二区| 亚洲最大成人综合| 国产馆精品极品| 成人激情综合网站| 久久精品理论片| 国产一区欧美日韩| 国产一区欧美二区| 成人av免费在线播放| 91福利在线看| 亚洲欧美另类久久久精品2019| 欧美一区二区三区喷汁尤物| 天堂一区二区在线免费观看| 亚洲图片你懂的| 911精品国产一区二区在线| 婷婷一区二区三区| 蜜臀av一区二区在线观看| 亚洲精品乱码久久久久| 中文字幕 久热精品 视频在线| 色菇凉天天综合网| 91在线一区二区| 91麻豆swag| 成人免费高清视频| 欧美日韩一区在线观看| 久久久精品欧美丰满| 伊人性伊人情综合网| 男男视频亚洲欧美| 国产一区激情在线| 色先锋aa成人| 国产亚洲福利社区一区| 一区二区三区不卡视频| 成人一二三区视频| 国产精品理伦片| 国产精品自拍一区| 国产精品毛片高清在线完整版| 国产精品一区二区三区乱码| 日韩欧美国产麻豆| 亚洲国产日日夜夜| 欧美午夜精品久久久久久孕妇| 亚洲精品写真福利| 成人午夜私人影院| 一区二区在线观看不卡| 欧美日韩一级黄| 亚洲美女免费视频| 欧美一区二区三区电影| 免费日韩伦理电影| 国产日韩成人精品| 欧美日韩精品专区| 成熟亚洲日本毛茸茸凸凹| 久久先锋资源网| 91丨九色丨蝌蚪富婆spa| 欧美一区二区三区啪啪| 亚洲成人资源在线| 欧美一级片在线看| 欧美精品久久99久久在免费线| 一本大道久久精品懂色aⅴ| 成人精品视频网站| 日韩不卡手机在线v区| 亚洲第一av色| 一区二区三区在线视频播放| 一区二区三区免费观看| 日韩一区二区麻豆国产| 色中色一区二区| 国产精品一区在线观看你懂的| 亚洲国产视频一区| 国产精品区一区二区三| 日韩女优av电影| 91久久一区二区| 91麻豆swag| 91视频免费播放| 久久国产日韩欧美精品| 日韩精品成人一区二区在线| 一区二区三区 在线观看视频| 久久精品欧美日韩| 欧美激情资源网| 国产精品久久三| 国产精品国产三级国产aⅴ原创| 国产婷婷一区二区| 国产日产欧产精品推荐色| 国产亚洲一区二区在线观看| 久久女同精品一区二区| 久久免费国产精品| 国产精品理伦片| 亚洲国产日韩一区二区| 亚洲福中文字幕伊人影院| 日韩综合小视频| 狠狠色丁香婷婷综合| 91丨porny丨在线| 欧美日韩国产a| 日韩欧美资源站| 亚洲视频一二三区| 亚洲码国产岛国毛片在线| 天堂蜜桃一区二区三区| 亚洲自拍偷拍图区| 久久国产精品色婷婷| av电影在线观看完整版一区二区| 成人黄色在线看| 91精品国产全国免费观看 | 国产日韩精品一区二区浪潮av | 日韩欧美在线123| 亚洲色大成网站www久久九九| 国产精品久久久久久妇女6080| 天天综合色天天综合| 不卡的av电影在线观看| 久久综合给合久久狠狠狠97色69| 亚洲欧美日本在线| 午夜视频在线观看一区二区三区| 极品销魂美女一区二区三区| 91丨porny丨户外露出| 国产日本一区二区| 蜜桃av噜噜一区| 欧美美女激情18p| 亚洲自拍偷拍综合| 91色视频在线| 国产精品进线69影院| 国产美女主播视频一区| 欧美一区二区三区电影| 午夜精品一区在线观看| heyzo一本久久综合| 中文字幕精品一区二区精品绿巨人| 亚洲电影一级黄| 91精品国产综合久久久久久漫画 | 午夜精品久久久久久久久久| 成人精品一区二区三区中文字幕| 日韩色视频在线观看| 丝袜美腿成人在线| 欧美日韩一区在线| 国产精品1区2区3区在线观看| 国产午夜久久久久| 欧美日韩的一区二区| 国产精品一区在线| 爽爽淫人综合网网站| 国产精品国产a| 欧美成人欧美edvon| 欧美日韩一区二区三区四区| 另类综合日韩欧美亚洲| 亚洲精品亚洲人成人网在线播放| 欧美一级黄色片| 欧美色欧美亚洲另类二区| 国产精品一卡二| 久久99精品国产麻豆婷婷洗澡| 一区二区三区国产精品| 国产精品九色蝌蚪自拍| 精品国产露脸精彩对白| 欧美一区二区成人| 欧美精品丝袜中出| 欧美最猛黑人xxxxx猛交| kk眼镜猥琐国模调教系列一区二区| 久久精品免费观看| 免费观看成人av| 蜜臀91精品一区二区三区| 亚洲成人免费观看| 亚洲成人黄色影院| 午夜成人在线视频| 日韩电影免费一区| 久久精品999| 国产91精品入口| www.av亚洲| 欧美日韩黄视频| 91精品国产综合久久久久久久久久| 欧美日韩国产一二三| 日韩一卡二卡三卡四卡| 精品日韩一区二区| 中文字幕在线免费不卡| 亚洲狠狠丁香婷婷综合久久久| 亚洲国产日日夜夜| 老汉av免费一区二区三区| 激情图片小说一区| 福利一区二区在线| 欧美日韩精品欧美日韩精品| 精品日本一线二线三线不卡| 中文字幕av一区二区三区高| 一区二区三区四区高清精品免费观看| 亚洲成人激情综合网| 国产精品99精品久久免费| 在线视频国内一区二区| 久久色.com| 日韩在线一区二区| 色av成人天堂桃色av| 26uuu亚洲|