非遞迴方式建立二叉樹

來源:互聯網
上載者:User

好長時間沒摸過二叉樹了,純屬練手

我發現功能描述發布出來就亂了,還是貼圖吧

#include <iostream>using namespace std;#define Type char#define MAX_BUFF 30#define INC_BUFF 20typedef struct _TreeNode{Type data;struct _TreeNode *lchild;struct _TreeNode *rchild;}TreeNode;TreeNode *createNode(){TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode));memset(node, 0, sizeof(TreeNode));return node;}/***************************function: createPreBinTreedescription:根據先序曆遍二叉樹序列建立二叉樹,曆遍序列需要給出空樹如:                                    A   /   \                 B     D/      /      C     E                                \ G先序了變序列是: ABC@G@@@DE@@@ (其中@代表空樹)原理:每當操作一個節點就將其push壓棧,遇到空@就pop。pop的目的就是為了建立右孩子。****************************/TreeNode *createPreBinTree(){char buff[MAX_BUFF];cin >> buff;char *pBuffer = buff;TreeNode *stack[MAX_BUFF] = {0};//定義棧TreeNode **spHead = stack;TreeNode **spTail = stack;TreeNode *pTree = NULL;TreeNode *rootNode = NULL;bool isCreateR = false;if ( '@' == *pBuffer)return NULL;else{rootNode = createNode();pTree = rootNode;rootNode->data = *pBuffer;pBuffer++;*(++spHead) = rootNode;//if ('@' == *pBuffer)//判斷root節點是否需要壓棧//isCreateR = true;//else//{////isCreateR = false;//}}for (int i = 0;(*pBuffer); i++){if ( '@' != *pBuffer){if ( !isCreateR){//此時建立的是左孩子,需要壓棧,壓棧的目的是為了以後建立右孩子TreeNode *newNode = createNode();newNode->data = *pBuffer;pTree->lchild = newNode;pTree = newNode;*(++spHead) = newNode;/*spHead++;*spHead = newNode;*/}else{TreeNode *newNode = createNode();newNode->data = *pBuffer;pTree->rchild = newNode;pTree = newNode;*(++spHead) = newNode;isCreateR = false;}//if !isCreateR}else{if ( !isCreateR){isCreateR = true;/*pTree = *spHead;*(spHead--) = NULL;*/}//else//{////isCreateR = true;//遇到右孩子是空,此時需要彈出棧頂//if ( spHead == spTail)//break;//}//if !isCreateR;if (spHead == spTail)break;else{pTree = *spHead;*(spHead--) = NULL;}}//if @pBuffer++;}return rootNode;}void visitNode(TreeNode *p){cout << p->data;}//先序曆遍二叉樹void preTraverse(TreeNode *p){TreeNode *stack[MAX_BUFF] = {0};TreeNode **spTail = stack;TreeNode **spHead = spTail + 1;TreeNode *root = p;TreeNode *curr = root;//visitNode(root);//*(++spHead) = root;do{if (curr){visitNode(curr);*(++spHead) = curr;curr = curr->lchild;}else {if (spHead -1 != spTail){curr = *spHead;*(spHead--) = NULL;curr = curr->rchild;}else--spHead;}}while (spHead  != spTail);}void main(){TreeNode *node = createPreBinTree();preTraverse(node);cout << endl;}

代碼測試過了。談不上什麼效率和演算法,純屬練手

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.