程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 輸出所有根節點到葉子節點的長度(以二叉排序樹為例)

輸出所有根節點到葉子節點的長度(以二叉排序樹為例)

編輯:C++入門知識

[cpp]
#include <iostream>  
#include <stack>  
using namespace std; 
//節點  
struct node 

    node *lchild,*rchild; 
    int value; 
}; 
 
//二元查找樹  
class list 

public: 
    list(); 
    //這裡的m_print函數用做遞歸,print函數相當於外面的一個套子  
    void print(); 
private: 
    //將遞歸函數私有化  
    void m_print(node *p,int value); 
private: 
    node* root; 
}; 
void list::m_print(node *p,int value) 

    //如果p為空,返回  
    if(p==NULL) 
        return; 
    //線路和相加  
    value+=p->value; 
     
    //到葉子節點返回  
    if(NULL==p->lchild && NULL==p->rchild){ 
          cout<<value<<endl; 
          return; 
    } 
    //向左右方向遞歸  
    m_print(p->lchild,value); 
    m_print(p->rchild,value); 
 

 
 
void list::print() 

    m_print(root,0); 

 
list::list() 

    cout<<"請輸入您要輸入的節點,按'#'退出:"<<endl; 
    int i; 
    //用cin.fail(),cin.bad()判斷也行  
    if(cin>>i==NULL){ 
      cout<<"您的輸入有誤"<<endl; 
      exit(-1); 
    } 
    //創建根節點  
    root=new node; 
    root->value=i; 
    root->lchild=NULL; 
    root->rchild=NULL; 
    //建立兩個臨時節點,p開辟新節點,q為二元查找定位  
    node *p,*q; 
    while(cin>>i!=NULL){ 
        //開辟新節點  
        p=new node; 
        p->value=i; 
        p->lchild=NULL; 
        p->rchild=NULL; 
        //二元查找樹比較從q=root開始,小則轉左,大則轉右,如果有位置就插入  
        q=root; 
        while(1){ 
            //插入節點小於該節點比較值,左節點為空則插入,否則q=q->lchild繼續判斷  
            if(p->value<q->value){ 
                if(q->lchild) 
                    q=q->lchild; 
                else{ 
                    q->lchild=p; 
                    break; 
                } 
            } 
            //插入節點大於該節點比較值,右節點為空則插入,否則q=q->rchild繼續判斷  
            else if(p->value>q->value){ 
                if(q->rchild) 
                    q=q->rchild; 
                else{ 
                    q->rchild=p; 
                    break; 
                } 
            } 
            //如果兩節點相等,直接退出程序(有些暴力)  
            else{ 
                cout<<"node repeated!!"<<endl; 
                exit(-1); 
            } 
        } 
    } 

 
void main() 

    list test; 
    //這裡的print函數打印出所有的根節點到所有葉子節點的長度  
    test.print();    
    system("pause"); 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved