树的三种遍历(递归和非递归)

来源:互联网 发布:最好的文档扫描软件 编辑:程序博客网 时间:2024/05/22 14:19
typedef struct BiTNode{      char data;      struct BiTNode *lchild, *rchild;      //左右孩子  }BiTNode,*BiTree;  

//先序遍历(根左右)(递归)

void LastOrder(BiTNode *root){ if(root != NULL) { cout << root->data<<endl; LastOrder(root->lchild); LastOrder(root->rchild);  }   }

void PreOrder(BiTNode *root){ if(root != NULL) { cout << root->data<<endl; PreOrder(root->lchild); PreOrder(root->rchild); } }

//中序遍历(左根右)(递归)

void MidOrder(BiTNode *root){ if(root != NULL) { MidOrder(root->lchild); cout << root->data<<endl; MidOrder(root->rchild);  }   }

//后续遍历(左右根)(递归)

void LastOrder(BiTNode *root){ if(root != NULL) { cout << root->data<<endl; LastOrder(root->lchild); LastOrder(root->rchild);  }   }
//先序的非递归 需要用到栈

void PreOrder(BiTNode *root){    if(root == NULL)    return NULL; stack<BiTNode> st; st.push(root); BiTNode *temp; while(!st.empty()) { temp = st.top();  //返回栈顶元素 cout<<temp->data<<" "; st.pop(); if(temp->rchild!=NULL)  //这里先遍历右节点,因为栈是后进先出,因为要先出左节点,所以要先进右节点     st.push(temp->rchild); if(temp->lchild!=NULL)     st.push(temp->lchild); } }

//中序的非递归

void MidOrder(BiTNode *root){if (root == NULL)    return NULL; stack<BiTNode*> st; BiTNode cur = root->lchild;  //create one pointer point to root's left node st.push(root);    //root into stack while(cur != NULL && !(st.empty())) { while(cur !=NULL )     {              st.push(cur);              cur = cur->lchild;   //一直向左遍历,然后进栈     } cur = st.top();    //cur = stack.top 就是最左的那个位置 st.pop();      //最左出栈 cout<<cur->data<<" ";  //输出最左 cur = cur->rchild;    }}
//后序非递归(待补充)

//树的深度

int depth(BiTNode *root){if(root==NULL)//如果rootoot为NULL,则深度为0,这也是递归的返回条件        return 0;    //如果pRoot不为NULL,那么深度至少为1,所以left和right=1    int left=1;    int right=1;    left+=depth(root->lchild);//求出左子树的深度    right+=depth(root->rchild);//求出右子树深度    return (left>right?left:right)+1;//返回深度较大的那一个,+1是因为没算根节点那一层}




阅读全文
0 0
原创粉丝点击