二叉树经典面试题汇总

来源:互联网 发布:深圳爱玩网络 编辑:程序博客网 时间:2024/05/01 13:42
二叉树经典面试题汇总
#include <iostream>using namespace std;#include <stack>#include <queue>class Tree;class treeNode{friend class Tree;public:int data;treeNode *lson;treeNode *rson;};struct node1{treeNode *btnode;bool isFirst;};class Tree{public:Tree() { root = NULL; }bool  insert(int a);bool  search(int a);void display1(treeNode *root);void display2(treeNode *root);void display3(treeNode *root);treeNode *find(treeNode *root,int  &k);treeNode *treeToList(treeNode *root);void convertNode(treeNode *root, treeNode *&lastNode);int max(int a, int b);int treeDeep(treeNode *root);bool isBinaryTree1(treeNode *root);//判断是否平衡树(法1)bool isBinaryTree(treeNode *root,int &deep);//判断是否平衡树(法2)void linePrint(treeNode *root);bool isSymmetric(treeNode *root);bool isSymmetric(treeNode *root1, treeNode *root2);treeNode *root;};bool Tree::insert(int a){treeNode *p = root;treeNode *q = 0;while (p){q = p;if(a < p->data)p = p->lson;else if (a > p->data) p = p->rson;else  return false; }p = new treeNode;p->lson = p->rson = NULL;p->data = a;if (root == NULL) root = p;else if (a < q->data) q->lson = p;else q->rson = p;return true;}bool Tree::search(int a){treeNode *p = root;while (p != NULL){if (a < p->data) p = p->lson;else if (a > p->data) p = p->rson;else { cout << p->data; return true; }}return false;}void Tree::display1(treeNode *root)//非递归前序遍历{stack<treeNode*> s;treeNode *p = root;while (p != NULL || !s.empty()){while (p != NULL){cout << p->data << " ";s.push(p);p = p->lson;}if (!s.empty()){p = s.top();s.pop();p = p->rson;}}}void Tree::display2(treeNode *root)//非递归中序遍历{stack<treeNode*>s;treeNode *p = root;while (p != NULL || !s.empty()){while (p != NULL){s.push(p);p=p->lson;}if (!s.empty()){p = s.top();cout << p->data << " ";s.pop();p = p->rson;}}}void Tree::display3(treeNode *root)//非递归后序遍历(new后没有delete){stack<node1 *> s;treeNode *p = root;node1 *temp;while (p!=NULL ||!s.empty()){while (p != NULL){node1 *btn = new node1;btn->btnode = p;btn->isFirst = true;s.push(btn);p = p->lson;}if (!s.empty()){temp = s.top();s.pop();if (temp->isFirst == true){temp->isFirst = false;s.push(temp);p = temp->btnode->rson;}else{cout << temp->btnode->data << " ";p = NULL;}}}}treeNode* Tree::find(treeNode *root, int &k)//找到第k个位置的结点{treeNode* target = NULL;if (root->lson != NULL)target = find(root->lson, k);if (target == NULL){if (k == 1)target = root;k--;}if (target == NULL &&root->rson != NULL)target = find(root->rson, k);return target;}treeNode * Tree::treeToList(treeNode *root)//树转化为双向链表part1{treeNode *head=root;while (head->lson) head = head->lson;//获得链表头结点treeNode *p = NULL;convertNode(root, p);return head;}void Tree::convertNode(treeNode *root, treeNode *&lastNode)//树转化为双向链表part2{if (root->lson != NULL)convertNode(root->lson, lastNode);root->lson = lastNode;if (lastNode != NULL)lastNode->rson = root;lastNode = root;if (root->rson != NULL)convertNode(root->rson, lastNode);}int Tree::max(int a, int b){return a > b ? a : b;}int Tree::treeDeep(treeNode *root)//树的深度{if (root == NULL)return 0;return max(treeDeep(root->lson) + 1, treeDeep(root->rson) + 1);}bool Tree::isBinaryTree1(treeNode *root)//判断是否平衡树方法一(多次迭代 效果差)(根据根的深度){if (root == NULL) return true;int left = treeDeep(root->lson);int right = treeDeep(root->rson);int gap = left - right;if (gap > 1 || gap < -1)return false;return isBinaryTree1(root->lson) && isBinaryTree1(root->rson);}bool Tree::isBinaryTree(treeNode *root,int &deep)//判断是否平衡树方法二(自己递归){if (root == NULL) { deep = 0; return true; }int left, right;if (isBinaryTree(root->lson, left) && isBinaryTree(root->rson, right))//左右子树都为平衡树{int gap = left - right;if (gap <= 1 || gap >= -1) { deep = (left > right ? 1+left : 1+right); return true; }}return false;}void Tree::linePrint(treeNode *root){queue<treeNode *> nodes;nodes.push(root);int nextLevel = 0;int remain = 1;while (!nodes.empty()){treeNode *p = nodes.front();nodes.pop();remain--;cout << p->data<<" ";if (p->lson != NULL){nodes.push(p->lson);nextLevel++;}if (p->rson != NULL){nodes.push(p->rson);nextLevel++;}if (remain == 0){remain = nextLevel;nextLevel = 0;cout << endl;}}}bool Tree :: isSymmetric(treeNode *root){isSymmetric(root, root);}bool Tree::isSymmetric(treeNode *root1, treeNode *root2)//(1.根相同 2.后面的递归相同){if (root1 == NULL &&root2 == NULL)return true;if (root1 == NULL || root2 == NULL)return false;if (root1->data != root2->data) return false;return isSymmetric(root1->lson,root2->rson) && isSymmetric(root1->rson,root2->lson);}int main(){Tree root;root.insert(10);root.insert(6);root.insert(14);root.insert(4);root.insert(8);root.insert(12);root.insert(16);root.display2(root.root);cout << "*********" << endl;int a = 1;cout << (root.find(root.root, a))->data << endl;/*cout << "二叉树转为链表" << endl;treeNode *header = root.treeToList(root.root);treeNode *pre = NULL;int count=0;while (header != NULL){pre = header;cout << header->data << " ";header=header->rson;}cout << endl;while (pre != NULL){cout << pre->data << " ";pre=pre->lson;}*/cout <<"树的深度"<< endl;cout << root.treeDeep(root.root) << endl;;cout << "是否为平衡二叉树" << endl;int deep;cout <<root.isBinaryTree(root.root,deep) << endl;cout << "按行打印二叉树" << endl;root.linePrint(root.root);system("pause");return 0;}

0 0
原创粉丝点击