算法与数据结构 树

目录

 

● 请你说一下BST的特点,并手写代码判断一棵树是不是BST

参考回答:

● 手写代码:给一个二叉树,怎么得到这棵树的镜像

参考回答:

● 手写代码:通过前序和中序还原二叉树

参考回答:

● 手写代码:求二叉树每层最大值

参考回答:

● 手写代码:两个平衡二叉树合并是怎么做的

参考回答:

● 手写代码:求全体二叉树节点最大值

参考回答:

● 手写代码:二叉树深度优先遍历

参考回答:


● 请你说一下BST的特点,并手写代码判断一棵树是不是BST

参考回答:

BST(二叉排序树):

1、每个结点都有一个作为搜索依据的关键码,所有结点的关键码不同

2、左子树上所有结点的关键码小于根节点的关键码

3、右子树所有结点的关键码大于根节点的关键码

4、左子树和右子树也是BST

判断一棵树是不是BST

class Node {

int data;

Node left;

Node right;

}

public class BSTChecker {

private static int lastVisit = Integer.MIN_VALUE;

public static boolean isBST(Node root) {

if(root == null) return true;

boolean judgeLeft = isBST(root.left); // 先判断左子树

if(root.data >= lastVisit && judgeLeft) { // 当前节点比上次访问的数值要大

lastVisit = root.data;

} else {

return false;

}

boolean judgeRight = isBST(root.right); // 后判断右子树

return judgeRight;

}

}

● 手写代码:给一个二叉树,怎么得到这棵树的镜像

参考回答:

public class Solution {

public void Mirror(TreeNode root) {

if(root==null){

return;

}

TreeNode temp = root.left;

root.left = root.right;

root.right = temp;

Mirror(root.left);

Mirror(root.right);

}

}

● 手写代码:通过前序和中序还原二叉树

参考回答:

//算法1

#include <iostream>

#include <fstream>

#include <string>

struct TreeNode

{

struct TreeNode* left;

struct TreeNode* right;

char  elem;

};

TreeNode* BinaryTreeFromOrderings(char* inorder, char* preorder, int length)

{

if(length == 0)

{

return NULL;

}

TreeNode* node = new TreeNode;

node->elem = *preorder;

int rootIndex = 0;

for(;rootIndex < length; rootIndex++)

{

if(inorder[rootIndex] == *preorder)

break;

}

node->left = BinaryTreeFromOrderings(inorder, preorder +1, rootIndex);

node->right = BinaryTreeFromOrderings(inorder + rootIndex + 1, preorder + rootIndex + 1, length - (rootIndex + 1));

std::cout<<node->elem<<std::endl;

free(node);

return NULL;

}

int main(int argc, char** argv){

char* pr="GDAFEMHZ";

char* in="ADEFGHMZ"; BinaryTreeFromOrderings(in, pr, 8); printf("\n"); return 0;}

● 手写代码:求二叉树每层最大值

参考回答:

思路:遍历树,给树的每一个节点赋予层数的信息,定义一个数组maxNum数组,存储每层中最大值,其下标i对应于树中的第i层,其中根节点为第0层。在遍历某个树节点时,先判断该节点的层数与当前数组中已存储的数是否相等,若相等,则将该节点值与当前数组最后一位值进行比较,数组取其中的最大值。若不相等,则该节点为该层第一个节点,直接将该节点值赋值给数组对应的位。深度遍历该二叉树,最后输出这个数组即可。

class Solution {

public:

vector<int> largestValues(TreeNode* root) {

if(root == NULL) {

return maxNum;

}

travel(root,level);

return maxNum;

}

TreeNode* travel(TreeNode* root, int level) {

if(!root) return NULL;

if(maxNum.size() < level + 1) {

maxNum.push_back(root->val);

} else {

maxNum[level] = max(root->val,maxNum[level]);

}

travel(root->left,level+1);

travel(root->right,level+1);

return root;

}

private:

int level = 0;

vector<int> maxNum;

};

● 手写代码:两个平衡二叉树合并是怎么做的

参考回答:

首先,将两棵树分别展开为有序链表

public TreeNode prev = null;

public void BSTtoLinkedList(TreeNode root) {

if (root == null) return;

BSTtoLinkedList(root.left);

if (prev != null) {

prev.right = root;

prev.left = null;

}

prev = root;

BSTtoLinkedList(root.right);

}

然后将两个有序链表合并

public TreeNode MergeTwoLinkedList(TreeNode n1, TreeNode n2) {

TreeNode head = new TreeNode();

while (n1 != null && n2 != null) {

if (n1.val < n2.val) {

head.right = n1;

n1 = n1.right;

} else {

head.right = n2;

n2= n2.right;

}

head = head.right;

}

if (n1 != null) {

head.right = n1;

head = head.right;

}

if (n2 != null) {

head.right = n2;

head = head.right;

}

return head.right;

}

● 手写代码:求全体二叉树节点最大值

参考回答:

public int maxTreeNode(TreeNode root) {

if (root.left == null && root.right == null) {

return root.val;

} else {

if (root.left != null && root.right != null) {

return root.val > maxTreeNode(root.left) ? (root.val > maxTreeNode(root.right) ? root.val

: maxTreeNode(root.right))

: (maxTreeNode(root.left) > maxTreeNode(root.right) ? maxTreeNode(root.left)

: maxTreeNode(root.right));

} else if (root.left == null && root.right != null) {

return root.val > maxTreeNode(root.right) ? root.val

: maxTreeNode(root.right);

} else {

return root.val > maxTreeNode(root.left) ? root.val

: maxTreeNode(root.left);

}

}

}

● 手写代码:二叉树深度优先遍历

参考回答:

//深度优先搜索

//利用栈,现将右子树压栈再将左子树压栈

void DepthFirstSearch(BitNode *root)

{

stack<BitNode*> nodeStack;

nodeStack.push(root);

while (!nodeStack.empty())

{

BitNode *node = nodeStack.top();

cout << node->data << ' ';

nodeStack.pop();

if (node->right)

{

nodeStack.push(node->right);

}

if (node->left)

{

nodeStack.push(node->left);

}

}

}

猜你喜欢

转载自blog.csdn.net/u012369559/article/details/89511342
今日推荐