二叉树相关问题,在面试中主要通过递归来实现
1.二叉树建立
/**二叉树建立**/ struct Data { int val; }; typedef struct BiNode { Data data; BiNode * left; BiNode * right; }* BiTree; static BiTree binTree;
/**先序创建**/ void CreateBiTree(BiTree * T) { cout<<"please input; end with #"<<endl; Data *data = (Data*)malloc(sizeof(Data)); cin>>data->val; if(data->val == 0) { (*T) = NULL; }else { (*T) = (BiNode *)malloc(sizeof(BiNode)); (*T)->data.val = data->val; CreateBiTree(&(*T)->left); CreateBiTree(&(*T)->right); } free(data); }
2.二叉树遍历
先序遍历
void PreOrderTraverse(BiTree T) { if(T == NULL) { return; } cout<<"val :"<<T->data.val <<endl; PreOrderTraverse(T->left); PreOrderTraverse(T->right); }
中序遍历
/**二叉树中序遍历**/ void InOrderTraverse(BiTree T) { if(T == NULL) { return; } InOrderTraverse(T->left); cout<<"val:"<<T->data.val<<endl; InOrderTraverse(T->right); }
后序遍历
/**二叉树后序遍历**/ void PostOrderTraverse(BiTree T) { if(T != NULL) { PostOrderTraverse(T->left); PostOrderTraverse(T->right); cout<<"val:"<<T->data.val<<endl; } }
3.二叉树树高
/**二叉树树高**/ int BiTreeHeight(BiTree T) { if(T == NULL) { return 0; }else { int lHeight = BiTreeHeight(T->left); int rHeight = BiTreeHeight(T->right); if(lHeight>rHeight) { return lHeight+1; }else { return rHeight+1; } return (lHeight>rHeight)?lHeight+1:rHeight+1; } }
4.二叉树树叶节点的个数
/**二叉树树叶节点的个数**/ int SumOfLeaf(BiTree T) { if(T == NULL) { return 0; } if(T->left==NULL&&T->right==NULL) { return 1; } return (SumOfLeaf(T->left)+SumOfLeaf(T->right)); }
5.二叉树左右子树交换
/**二叉树左右子树互换**/ void SwapChild(BiTree T) { if((T)==NULL) { return; } BiNode *temp = (T)->right; (T)->right = (T)->left; (T)->left = temp; SwapChild((T)->left); SwapChild((T)->right); }
6.二叉树按层次遍历(广度优先遍历)
/**二叉树按层次遍历(广度优先遍历)**/ void Traverse(BiTree T) { if(T == NULL) { return; } deque<BiNode *> dequeTreeNode; dequeTreeNode.push_back(T); while(dequeTreeNode.size()) { BiNode * pnode = dequeTreeNode.front(); dequeTreeNode.pop_front(); cout<<"traverse val:"<<pnode->data.val<<endl; if(pnode->left) { dequeTreeNode.push_back(pnode->left); } if(pnode->right) { dequeTreeNode.push_back(pnode->right); } } }
7.二叉树中和为某一值得路径
/***二叉树中和为某一值得路径*/ void FindPath(BiTree T,int expectedNum,vector<int>& path,int currentSum) { currentSum += T->data.val; path.push_back(T->data.val); bool isLeaf = (T->left==NULL)&&(T->left==NULL); if(currentSum == expectedNum&&isLeaf) { cout<<"A path is found: "<<endl; vector<int>::iterator iter = path.begin(); for(;iter!=path.end();++iter) cout<<(*iter)<<endl; cout<<"end"<<endl; } if(!isLeaf) { if(T->left!=NULL) { FindPath(T->left,expectedNum,path,currentSum); } if(T->right!=NULL) { FindPath(T->right,expectedNum,path,currentSum); } } path.pop_back(); } void FindPath(BiTree T,int expectedNum) { if(T == NULL) { return; } vector<int> path; int currentNum = 0; FindPath(T,expectedNum,path,currentNum); }