第一题:
//判断二叉树是否为完全二叉树,完全二叉树的定义为,前n-1层都是满的,第n层如有空缺,
//则是缺在右边即,第n层的最右边的节点,它的左边是满的,右边是空的
//方法一:
//这个问题的描述已经提示了解法,采用广度优先遍历,从根节点开始,入队列,如果队列不为空,
//循环,遇到第一个没有左儿子,或者右儿子的节点设置标志位,如果之后在遇到有左或者右儿子的
//节点那么,这不是一颗完全二叉树
//这个方法需要遍历整棵树,复杂度为O(n),n为节点的总个数
#pragma once
struct Node
{
int _data;
struct Node* _left;
struct Node* _right;
Node(int data)
:_data(data)
, _left(NULL)
, _right(NULL)
{}
};
//class BinaryTree
//{
//public:
// BinaryTree(int *array,const int size,const int invalid)
// :_root(NULL)
// {
// int index=0;
// _root = _Create(array, size, invalid,index);
// }
//protected:
// Node* _Create(int *array, const int size, const int invalid, int &index)
// {
// assert(array);
// if (index < size&&a[index] != invalid)
// {
// Node *cur = new Node(a[index]);
// cur->_letf = _Create(array, size, invalid, ++index);
// cur->_right = _Create(array, size, invalid, ++index);
// return cur;
// }
// return NULL;
// }
//protected:
// Node *_root;
//};
Node* _Create(int *array, const int size, const int invalid, int &index)
{
assert(array);
if (index < size&&array[index] != invalid)
{
Node *cur = new Node(array[index]);
cur->_left = _Create(array, size, invalid, ++index);
cur->_right = _Create(array, size, invalid, ++index);
return cur;
}
return NULL;
}
//实现广度遍历需要队列
queue<Node*> myqueue;
//第n层最右节点的标志
bool leftMost = false;
bool ProcessChild(Node *child)
{
if (child)
{
if (!leftMost)
{
myqueue.push(child);
}
else
{
return false;
}
}
else
{
leftMost = true;
}
return true;
}
bool IsCompleteBinaryTree(Node *root)
{
//空树也是完全二叉树
if (!root)
{
return true;
}
//首先根节点入队列
myqueue.push(root);
while (!myqueue.empty())
{
Node* node = myqueue.front();
myqueue.pop();
//处理左节点
if (!ProcessChild(node->_left))
{
return false;
}
if (!ProcessChild(node->_right))
{
return false;
}
}
//广度优先遍历完毕,是完全二叉树
return true;
}
int depth(Node *root)
{
if (root == NULL)
return 0;
int leftdepth = depth(root->_left);
int rightdepth = depth(root->_right);
return(leftdepth > rightdepth ? leftdepth : rightdepth) + 1;
}
void question1Test()
{
//int array[13] = { 10, 6, 4, '#', '#', 8, '#', '#', 14, 12, '#', '#', 16 };
int array[11] = { 10, 6, 4, '#', '#', 8, '#', '#', 14, '#', 16 };
int index = 0;
Node* root = _Create(array, sizeof(array) / sizeof(int), '#',index);
cout << IsCompleteBinaryTree(root) << endl;
}
第二题
//题目:将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,
//只能调整树中节点指针的指向
//解析:进行中序遍历,改变指针方向
struct Node
{
int _data;
Node* _left;
Node* _right;
Node(int data)
:_data(data)
, _left(NULL)
, _right(NULL)
{}
};
class BinaryTree
{
public:
BinaryTree(int *array, const int size, const int invalid)
:_root(NULL)
{
int index = 0;
_root = _Create(array, size, invalid,index);
}
Node* _Create(int *array, const int size, const int invalid, int &index)
{
assert(array);
if (index < size&&array[index] != invalid)
{
Node *cur = new Node(array[index]);
cur->_left = _Create(array, size, invalid, ++index);
cur->_right = _Create(array, size, invalid, ++index);
return cur;
}
return NULL;
}
void Tree_To_Dlist()
{
Node *prev = NULL;
_Tree_To_Dlist(_root,prev);
while (_root->_left)
{
_root = _root->_left;
}
}
void Print_DList()
{
Node *cur = _root;
while (cur)
{
cout << cur->_data << endl;
cur = cur->_right;
}
}
protected:
void _Tree_To_Dlist(Node*root,Node*& prev)
{
if (root == NULL)
return;
_Tree_To_Dlist(root->_left,prev);
root->_left = prev;
if (prev)
{
prev->_right = root;
}
prev = root;
_Tree_To_Dlist(root->_right, prev);
/*stack<Node*> q;
Node* cur = _root;
while (cur)
{
q.push(cur);
_root = cur;
cur = cur->_left;
}
Node* prev = NULL;
while ((cur != NULL) || (!q.empty()))
{
while (cur)
{
q.push(cur);
cur = cur->_left;
}
while (!q.empty())
{
cur = q.top();
q.pop();
cur->_left = prev;
if (prev != NULL)
{
prev->_right = NULL;
}
prev = cur;
if (cur->_right)
{
cur = _root->_right;
}
}
}*/
}
protected:
Node *_root;
};
void question2Test()
{
int array[13] = { 10, 6, 4, '#', '#', 8, '#', '#', 14, 12, '#', '#', 16 };
//int array[11] = { 10, 6, 4, '#', '#', 8, '#', '#', 14, '#', 16 };
int index = 0;
BinaryTree bt(array, sizeof(array) / sizeof(int), '#');
bt.Tree_To_Dlist();
bt.Print_DList();
}
转载于:https://blog.51cto.com/10794428/1834544