从指定节点处拆分二叉树

如T,直接上码子:程序中用到了建树函数(不会搞模板,每次都得重新写,5……%>_<%),前序遍历以验证是否正确拆分开,原树用来保存拆分后剩下的树,newtree则是拆分出来的新树。。。

#include<iostream> #include<stack> using namespace std; typedef struct tr { int data; struct tr *left,*right; }tre,*tree; stack<tree>st; tree creat(tree root,int val) { tree newtree; if(NULL==root) { newtree=new tre; newtree->data=val; newtree->left=newtree->right=NULL; return newtree; } if(val<=root->data) root->left=creat(root->left,val); else root->right=creat(root->right,val); return root; } tree split(tree &root,int val)//指定从某节点处拆开原二叉树 { tree newtree; if(NULL!=root) { if(root->data==val) { newtree=root; root=NULL; return newtree; } else { newtree=split(root->left,val);//拆分左子树 if(!newtree) newtree=split(root->right,val);//拆分右子树 return newtree; } } else return NULL; } void lbr(tree root) { while(!st.empty() || NULL!=root) { if(NULL!=root)//左子树入栈 { st.push(root); root=root->left; } else { root=st.top(); st.pop(); printf("%d ",root->data); root=root->right; } } } int main() { int n; tree tmp,newtree; tmp=NULL; while(scanf("%d",&n),n+1) tmp=creat(tmp,n); scanf("%d",&n); newtree=split(tmp,n); lbr(tmp); printf("/n"); lbr(newtree); return false; }

你可能感兴趣的:(struct,tree,null)