二叉树问题
二叉树问题总可以用几种方法解决:
- 递归的方法,基本上第一眼就是要用递归
2.几种遍历,前序、中序、后序、
层次遍历(重,还可以用来求最大宽度,)
void levelTraverse(BTNode*root)//还可以求最大宽度, { vector<BTNode*>v; int front=0,rear; if(root) v.push_back(root); int maxWidth=0; while(front<v.size()) { rear=v.size(); int tempMax=0; while(front<rear) { tempMax++; BTNode*temp=v[front++]; cout<<temp->a<<" "; if(temp->lchild)v.push_back(temp->lchild); if(temp->rchild)v.push_back(temp->rchild); } if(maxWidth<tempMax) maxWidth=tempMax; cout<<endl; } cout<<"这棵树的最大宽度是:"<<maxWidth<<endl; }
3.非递归的后序遍历(用来找路径):任意节点的路径,一般和给定一个节点有关,
(1)路径和==key,输出路径
typedef struct{ BTNode* data; int tag;//==0表示从左子节点返回,==1表示从右子节点返回 int sum;//每个节点到根节点的路径和 }Stack; Stack stack[100]; int top=-1; /////////////////////////////////////////////////////////////////////// void postOder(BTNode* root,int key) { while(root!=NULL||top>=0) { while(root!=NULL) { stack[++top].data=root; stack[top].tag=0; stack[top].sum=stack[top-1].sum+root->a;//路径的和 //cout<<stack[top].sum<<"++"<<endl; root=root->lchild; } while(top>=0&&stack[top].tag==1) { /* if(stack[top].data->a==key)//当key等于给定的数时,找根到这个书的路径 { while(top>=0) { cout<<stack[top--].data->a<<"--"; } return; }*/ // cout<<stack[top].sum<<"--"<<endl; if(stack[top].sum==key&&(stack[top].data->lchild==NULL&&stack[top].data->rchild==NULL))//首先要是叶子节点,然后和==key { int temp=top; while(temp>=0) { cout<<stack[temp--].data->a<<"--";//top后面还会用到,所以就用temp } cout<<endl;//不return ,说不定后面还有 } //****************必须要有 /* int t=stack[top].data->a; stack[top--].sum=stack[top].sum-t;*/ top--; // cout<<stack[top--].data->a<<" "; } if(top>=0&&stack[top].tag==0) { stack[top].tag=1; root=stack[top].data->rchild; } } } /* void preOder(BTNode* root) { while(root!=NULL||top>=0) { cout<<root->a<<" "; stack[++top].data=root; root=root->lchild; } while() }*/
(2)求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是 这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。
解答:用第三种方法,找到最大公共节点,知道了两条路径,长度分别是m,n, 而最大公共节点到根节点的长度是t,那么距离=m-t+n-t;