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是因为没算根节点那一层 }