二叉樹建立的輸入問題
阿新 • • 發佈:2018-12-11
這幾天在看資料結構的二叉樹,被二叉樹建立時的輸入問題困擾很久。二叉樹的建立一般使用遞迴演算法,將所有節點的資料一股腦的輸入,遞迴無法停止,二叉樹就無法建立。
感謝此博文,原來我們在輸入節點資料的時候,必須輸入空閒葉子節點,並用特殊符號標記,比如上述的博文的空閒葉子節點採用‘0’作為標記符,就能完整建立二叉樹。
修改後的程式碼,親測有效:
#include<iostream> #include<stdio.h> using namespace std; struct node { char data; node *left; node *right; node(){left=NULL;right=NULL;}; }; node *input() { node *p; char c; scanf("%c",&c); if(c=='#') p=NULL; else { p=new node; p->data=c; p->left=input(); p->right=input(); } return p; } void pre(node *root) { if(root) { char c; c=root->data; printf("%c",c); pre(root->left); pre(root->right); } } void in(node *root) { if(root) { char c; c=root->data; in(root->left); printf("%c",c); in(root->right); } } void post(node *root) { if(root) { char c; c=root->data; post(root->left); post(root->right); printf("%c",c); } } int nodenum(node *root) { if(root==NULL) { return 0; } else { return 1+nodenum(root->left)+nodenum(root->right); } } int leafnum(node *root) { if(root==NULL) { return 0; } else if((root->left==NULL)&&(root->right==NULL)) { return 1; } else { return leafnum(root->left)+leafnum(root->right); } } int deep(node *root) { if(root==NULL) { return 0; } else { return deep(root->left)>deep(root->right)?1+deep(root->left):1+deep(root->right); } } int main() { node *p; p=new node; p=input(); cout<<"先序遍歷"<<endl; pre(p); printf("\n"); cout<<"中序遍歷"<<endl; in(p); printf("\n"); cout<<"後序遍歷"<<endl; post(p); printf("\n"); cout<<"節點數"<<nodenum(p)<<endl; cout<<"葉子數"<<leafnum(p)<<endl; cout<<"深度"<<deep(p)<<endl; return 0; }